Pandas是数据分析的黄金标准库。 拥有加载,过滤,操作和浏览数据的功能,因此毫无疑问它是数据科学家的最爱。

我们大多数人自然会坚持Pandas的基本知识。 从CSV文件加载数据,过滤几列,然后直接跳入数据可视化。 然而,Pandas实际上具有许多鲜为人知但有用的功能,这些功能可以使处理数据变得更加轻松和整洁。

本教程将指导您完成其中5个更高级的功能-它们的作用和使用方法。 数据带来更多乐趣!

(1)配置选项和设置

Pandas带有一组用户可配置的选项和设置。 它们可以极大地提高生产力,因为它们使您可以根据自己的喜好定制Pandas环境。

例如,我们可以更改某些Pandas的显示设置,以更改显示的行数和列数以及显示的精度浮点数。

import pandas as pddisplay_settings = {    'max_columns': 10,    'expand_frame_repr': True,  # Wrap to multiple pages    'max_rows': 10,    'precision': 2,    'show_dimensions': True}for op, value in display_settings.items():    pd.set_option("display.{}".format(op), value)

上面的代码确保Pandas始终最多显示10行和10列,浮点值最多显示2个小数位。 这样,当我们尝试打印大的DataFrame时,我们的终端机或Jupyter Notebook不会看起来一团糟!

那只是一个基本的例子。 除了简单的显示设置之外,还有很多其他可以探索的内容。 您可以查看官方文档中的所有选项。

(2)合并数据框

Pandas DataFrames的一个相对未知的部分,是实际上有2种不同的方式来组合它们。 每种方法都会产生不同的结果,因此,根据您要实现的目标选择合适的方法非常重要。 此外,它们包含许多可进一步自定义合并的参数。 让我们检查一下。

级联

串联是组合DataFrame的最著名方法,可以直观地认为是“堆栈”。 该堆叠可以水平或垂直进行。

假设您有一个庞大的CSV格式的数据集。 将其拆分为多个文件以便于处理是很有意义的(这是大型数据集的常见做法,称为分片)。

将其加载到Pandas中时,您可以垂直堆叠每个CSV的DataFrame来为所有数据创建一个大的DataFrame。 例如,如果我们有3个分片,每个分片有500万行,那么在垂直堆叠所有分片之后,最终的DataFrame将有1500万行。

下面的代码显示了如何在Pandas中垂直连接DataFrame。

# Vertical concatpd.concat([october_df, november_df, december_df], axis=0)

您可以通过按列而不是行拆分数据集来执行类似的操作-每个CSV文件有几列(包含数据集的所有行)。 就像我们将数据集的功能划分为不同的碎片一样。 然后,您将水平堆叠它们以合并那些列/要素。

# Horizontal concatpd.concat([features_1to5_df, features_6to10_df, features_11to15_df], axis=1)

合并

合并更复杂但功能更强大,以类似于SQL的样式合并Pandas DataFrame。 也就是说,DataFrames将通过一些公共属性来合并。

想象一下,您有2个描述YouTube频道的数据框。 其中一个包含用户ID列表以及每个用户在您的频道上总共花费了多少时间。 另一个包含类似的用户ID列表以及每个用户观看过多少个视频。 合并使我们可以通过匹配用户ID,然后将ID,花费的时间和视频计数放在每个用户的一行中,将2个DataFrame组合为一个。

熊猫中的两个数据框的合并是通过合并功能完成的。 您可以在下面的代码中看到有关其工作方式的示例。 左右参数指的是您要合并的2个数据框,而on则指定要用于匹配的列。

pd.merge(left=ids_and_time_df,         right=ids_and_videos_df,         on="id")

为了进一步模拟SQL联接,how参数可让您选择要执行的SQL样式联接的类型:内部,外部,左侧或右侧。 要了解有关SQL连接的更多信息,请参见W3Schools教程。

(3)重塑数据帧

有几种方法可以重塑和重组Pandas DataFrame。 这些范围从简单易用到功能强大和复杂。 让我们看看最常见的3种。 对于以下所有示例,我们将使用此超级英雄数据集!

import pandas as pdplayers_data = {'Player': ['Superman', 'Batman', 'Thanos', 'Batman', 'Thanos',   'Superman', 'Batman', 'Thanos', 'Black Widow', 'Batman', 'Thanos', 'Superman'],   'Year': [2000,2000,2000,2001,2001,2002,2002,2002,2003,2004,2004,2005],   'Points':[23,43,45,65,76,34,23,78,89,76,92,87]}   df = pd.DataFrame(players_data)print(df)"""         Player  Year  Points0      Superman  2000      231        Batman  2000      432        Thanos  2000      453        Batman  2001      654        Thanos  2001      765      Superman  2002      346        Batman  2002      237        Thanos  2002      788   Black Widow  2003      899        Batman  2004      7610       Thanos  2004      9211     Superman  2005      87"""

转置

所有这些中最简单的。 转置将DataFrame的行与其列交换。 如果您有5000行和10列,然后转置DataFrame,则最终将得到10行和5000列。

df = df.Tprint(df)"""              0       1       2       3       4         5       6       7            8       9       10        11Player  Superman  Batman  Thanos  Batman  Thanos  Superman  Batman  Thanos  Black Widow  Batman  Thanos  SupermanYear        2000    2000    2000    2001    2001      2002    2002    2002         2003    2004    2004      2005Points        23      43      45      65      76        34      23      78           89      76      92        87"""

分组 Group BY

Groupby的主要用途是根据某些键将DataFrame分为多个部分。 将DataFrame拆分为多个部分后,您可以循环浏览并在每个部分上独立应用一些操作。

例如,我们可以看到在下面的代码中如何创建具有相应年份和积分的玩家数据框。 然后,我们根据播放器进行了分组,将DataFrame分为多个部分。 因此,每个玩家都有自己的群组,显示该玩家每年在活动中获得的积分。

groups_df = df.groupby('Player')for player, group in groups_df:   print("----- {} -----".format(player))   print(group)   print("")   ### This prints out the following"""----- Batman -----   Player  Year  Points1  Batman  2000      433  Batman  2001      656  Batman  2002      239  Batman  2004      76----- Black Widow -----        Player  Year  Points8  Black Widow  2003      89----- Superman -----      Player  Year  Points0   Superman  2000      235   Superman  2002      3411  Superman  2005      87----- Thanos -----    Player  Year  Points2   Thanos  2000      454   Thanos  2001      767   Thanos  2002      7810  Thanos  2004      92"""

堆叠 Stack

堆叠将DataFrame转换为具有多级索引,即每行具有多个子部分。 这些子部分是使用DataFrame的列创建的,并将其压缩为多索引。 总体而言,可以将堆栈视为将列压缩为多索引行。

最好通过一个示例来说明,如下所示。

df = df.stack()print(df)"""0   Player       Superman    Year             2000    Points             231   Player         Batman    Year             2000    Points             432   Player         Thanos    Year             2000    Points             453   Player         Batman    Year             2001    Points             654   Player         Thanos    Year             2001    Points             765   Player       Superman    Year             2002    Points             346   Player         Batman    Year             2002    Points             237   Player         Thanos    Year             2002    Points             788   Player    Black Widow    Year             2003    Points             899   Player         Batman    Year             2004    Points             7610  Player         Thanos    Year             2004    Points             9211  Player       Superman    Year             2005    Points             87"""

(4)处理时间数据

Datetime库是Python的主要组成部分。 每当您处理与现实世界中的日期和时间信息相关的任何内容时,它都是您的转库。 幸运的是,Pandas还具有使用Datetime对象的功能。

让我们举例说明。 在下面的代码中,我们首先创建一个包含4列的DataFrame:Day,Month,Year和data,然后按年和月对它进行排序。 如您所见,这非常混乱。 我们只用3列来存储日期,而实际上我们知道日历日期只是1个值。

from itertools import productimport pandas as pdimport numpy as npcol_names = ["Day", "Month", "Year"]df = pd.DataFrame(list(product([10, 11, 12], [8, 9], [2018, 2019])),                   columns=col_names)df['data'] = np.random.randn(len(df))df = df.sort_values(['Year', 'Month'], ascending=[True, True])print(df)"""    Day  Month  Year      data0    10      8  2018  1.6853564    11      8  2018  0.4413838    12      8  2018  1.2760892    10      9  2018 -0.2603386    11      9  2018  0.40476910   12      9  2018 -0.3595981    10      8  2019  0.1454985    11      8  2019 -0.7314639    12      8  2019 -1.4516333    10      9  2019 -0.9882947    11      9  2019 -0.68704911   12      9  2019 -0.067432"""

我们可以用datetime清理事情。

Pandas方便地附带了一个名为to_datetime()的函数,该函数可以将多个DataFrame列压缩并将其转换为单个Datetime对象。 采用这种格式后,就可以使用Datetime库的所有灵活性。

要使用to_datetime()函数,您需要将相关列中的所有“日期”数据传递给它。 那就是“日”,“月”和“年”列。 一旦有了Datetime格式的内容,我们就不再需要其他列,只需删除它们即可。 看看下面的代码,看看它们如何工作!

from itertools import productimport pandas as pdimport numpy as npcol_names = ["Day", "Month", "Year"]df = pd.DataFrame(list(product([10, 11, 12], [8, 9], [2018, 2019])),                   columns=col_names)df['data'] = np.random.randn(len(df))df = df.sort_values(['Year', 'Month'], ascending=[True, True])df.insert(loc=0, column="date", value=pd.to_datetime(df[col_names]))df = df.drop(col_names, axis=1).squeeze()print(df)"""         date      data0  2018-08-10 -0.3289734  2018-08-11 -0.6707908  2018-08-12 -1.3605652  2018-09-10 -0.4019736  2018-09-11 -1.23875410 2018-09-12  0.9576951  2019-08-10  0.5711265  2019-08-11 -1.3207359  2019-08-12  0.1960363  2019-09-10 -1.7178007  2019-09-11  0.07460611 2019-09-12 -0.643198"""

(5)将项目映射到组

映射是一个巧妙的技巧,有助于组织分类数据。 例如,想象一下,我们有一个巨大的DataFrame,其中包含成千上万的行,其中一列包含我们要分类的项目。 这样做可以大大简化机器学习模型的训练和有效地可视化数据。

请查看下面的代码以获取一个迷你示例,其中有我们要分类的食品列表。

import pandas as pdfoods = pd.Series(["Bread", "Rice", "Steak", "Ham", "Chicken",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Bread", "Rice", "Steak", "Ham", "Chicken",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Bread", "Rice", "Steak", "Ham", "Chicken",                       "Bread", "Rice", "Steak", "Ham", "Chicken",                       "Bread", "Rice", "Steak", "Ham", "Chicken",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Apples", "Potatoes", "Mangoes", "Fish",                       "Bread", "Rice", "Steak", "Ham", "Chicken",                       "Bread", "Rice", "Steak", "Ham", "Chicken",])groups_dict = {    "Protein": ["Steak", "Ham", "Chicken", "Fish"],    "Carbs": ["Bread", "Rice", "Apples", "Potatoes", "Mangoes"]}

在上面的代码中,我们将列表放入了pandas系列。 我们还创建了一个字典,其中显示了我们想要的映射,将每个食品分类为“蛋白质”或“碳水化合物”。 这是一个玩具的例子,但是如果这个系列是大规模的,比如说长度为1,000,000件,那么遍历它根本是不实际的。

除了基本的for循环,我们还可以使用Pandas内置的.map()函数编写函数,以优化的方式执行映射。 请查看下面的代码,以查看该功能及其应用方式。

def membership_map(pandas_series, groups_dict):    groups = {x: k for k, v in groups_dict.items() for x in v}    mapped_series = pandas_series.map(groups)    return mapped_series    mapped_data = membership_map(foods, groups_dict)print(list(mapped_data))

在函数中,我们首先遍历字典以创建一个新的字典,其中的键代表Pandas系列中每个可能的项目,其值代表新的映射项目“蛋白质”或“碳水化合物”。 然后,我们只需应用Pandas的内置map函数来映射系列中的所有值

查看下面的输出以查看结果!

['Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein']

(本文翻译自George Seif的文章《5 Advanced Features of Pandas and How to Use Them》,参考:https://towardsdatascience.com/5-advanced-features-of-pandas-and-how-to-use-them-1f2e2585d83e)

pandas 分层取5个数据_5个Pandas的高级功能相关推荐

  1. pandas 分层取5个数据_Pandas数据可视化的9个要点「附案例」

    文末领取[数据可视化图表选择指南] 数据可视化可以让我们很直观的发现数据中隐藏的规律,察觉到变量之间的互动关系,可以帮助我们更好的给他人解释现象,做到一图胜千文的说明效果. 常见的数据可视化库有: m ...

  2. python爬虫表格table_Python基于pandas爬取网页表格数据

    以网页表格为例:https://www.kuaidaili.com/free/ 该网站数据存在table标签,直接用requests,需要结合bs4解析正则/xpath/lxml等,没有几行代码是搞不 ...

  3. pandas生成新的累加数据列、pandas生成新的累加数据列(数据列中包含NaN的情况)、pandas计算整个dataframe的所有数据列的累加

    pandas生成新的累加数据列.pandas生成新的累加数据列(数据列中包含NaN的情况).pandas计算整个dataframe的所有数据列的累加 目录

  4. pandas读取csv某一列_让pandas处理大数据速度变快的三个技巧

    上一篇文章 写的是处理GB级数据时datatable比pandas会更高效,但是datatable使用起来毕竟不如pandas来的顺手.所以今天准备介绍pandas的三个使用技巧来让我们的运行效率提高 ...

  5. pandas分层索引(层级索引、MultiIndex)的创建、取值、切片、统计计算以及普通索引和层级索引的转换方法

    pandas分层索引(层级索引.MultiIndex)的创建.取值.切片.统计计算以及普通索引和层级索引的转换方法 @TOC 多层索引的Series 层级索引的创建 层级索引(multi index) ...

  6. pandas任取dataframe中的一个或者多个数据行(head、tail、loc、iloc),将抽取到的一个或者多个数据行复制N次形成新的dataframe

    pandas任取dataframe中的一个或者多个数据行(head.tail.loc.iloc),将抽取到的一个或者多个数据行复制N次形成新的dataframe 目录

  7. pandas爬取表格数据

    利用pandas 方法: 1.soup = BeautifulSoup(html.content, 'lxml', from_encoding='utf-8') 2.pd.read_html() 请求 ...

  8. pandas取第一行数据_Pandas DataFrame 取一行数据会得到Series的方法

    Pandas DataFrame 取一行数据会得到Series的方法 Pandas DataFrame 取一行数据会得到Series的方法 如题,想要取如下dataframe的一行数据,以为得到的还是 ...

  9. pandas爬取数据示例网页

    pandas爬取数据示例网页 排名 国家/地区 所在洲 年份 GDP(美元) 占世界比重 0 nan 全世界 nan 2020 84.75万亿 (84,746,978,784,172) nan 1 1 ...

最新文章

  1. 比特币现金与比特币呈竞争关系 分析表示加密货币之间的竞争不是坏事
  2. @Autowired注入了dao,为什么还要写getDao(){return userDao}这个方法?有什么作用?
  3. JavaScript属性操作
  4. 香港四大天王影帝情况(截止2016)
  5. ASP.NET MVC动态加载数据
  6. dom解析和sax解析的区别及优缺点
  7. python运行程序的快捷键_在Python集成开发环境中,可使用快捷键()运行程序。...
  8. Oracle中别名长度也限得这么死!!!
  9. Android 系统性能优化(82)---Android性能优化:手把手带你全面实现内存优化
  10. 【Java】Arrays.asList 有坑
  11. 微型计算机接口与技术答案,微型计算机接口技术与应用习题答案(刘乐善).doc
  12. Hive中类SQL语言中的where 与having
  13. 哪个oracle工具可以免费,Sqlite导入Oracle工具下载官方免费版_SqliteToOracle2.2英文版 - 系统之家...
  14. U盘硬盘文件提示“文件或目录损坏且无法读取”问题解决
  15. Android开机执行指定shell脚本
  16. 三大框架之---MyBaits第二章
  17. NLP标注工具:【免费:doccano、标注精灵、brat、YEDDA、DeepDive、rasa-nlu-trainer】【收费:Prodigy】
  18. HDU 6148 Valley Numer (数位dp)
  19. 15个WordPress幻灯片画廊插件
  20. 【英语】很抱歉,我一天的86400秒却没有你

热门文章

  1. Python数据分析分组聚合重采样典型例题及其解法
  2. 如何在Mac,iPhone或iPad上标记文件
  3. java random 伪随机_真/伪随机、以及随机算法
  4. 2015年十一期间小结
  5. 看了一篇关于人生评论
  6. 环信即时通讯单聊集成,添加好友,实现单聊
  7. 关于集成老版本百度地图提交Appstore被拒问题
  8. 未来教育计算机一级一本通光盘,《未来教育·2010全国计算机等级考试:一本通一级B》低价购书_计算机与互联网_孔网...
  9. python雪峰_python雪峰python 图 自身遍历及弱引用使用
  10. C语言 打印y=sin(x)图像