pandas 分层取5个数据_5个Pandas的高级功能

222ef45ceb05a2a5c5ef14d519832f20.png

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值