Pandas的五个高级功能以及如何使用它们但是很多人只了解基础知识。本文介绍的这些鲜为人知的进阶方法,让你更轻松利落的处理数据。Pandas是数据世界的典型图书馆。凭借加载、过滤、处理和探索数据的能力,它成为数据科学家的最爱也就不足为奇了。大多数人自然会坚持Pandas的基本方法。从CSV文件加载数据,过滤几列,然后直接进入数据可视化。但Pandas实际上有许多鲜为人知但有用的功能,可以使数据处理变得更加容易和清晰。本教程将介绍5个更高级的功能,它们的作用以及如何使用它们。(1)配置选项和设置Pandas带有一组用户可配置的选项和设置。它们可以大大提高生产力,因为您可以根据自己的喜好自定义Pandas环境。比如我们可以改变Pandas的一些显示设置,改变显示的行数和列数,以及显示的精度浮点数。importpandasasspddisplay_settings={'max_columns':10,'expand_frame_repr':True,#Wraptomultiplepages'max_rows':10,'precision':2,'show_dimensions':True}forop,valueindisplay_settings.items():pd.set_option("显示。{}".format(op),value)上面的代码保证了Pandas始终最多显示10行10列,浮点值最多显示2位小数。这样,当我们尝试打印大型DataFrame时,我们的终端或JupyterNotebook就不会看起来一团糟!这只是一个基本示例。除了简单的显示设置之外,还有许多设置可供探索。所有选项都可以在官方文档(https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html)中查看。(2)合并DataFramesPandasDataFrames一个相对不为人知的方面是实际上有两种不同的方式来合并它们。每种方法都会产生不同的结果,因此根据您要实现的目标选择正确的方法很重要。此外,它们包含许多参数以进一步自定义合并。不妨看看。ConcatenationConcatenation是最著名的合并DataFrame的方法,类似于“堆叠”。这种堆叠可以水平或垂直进行。假设您有一个CSV格式的庞大数据集。将其拆分为多个文件进行处理是有意义的(这是大型数据集的常见做法,称为分片)。将其加载到Pandas后,您可以垂直堆叠每个CSV的DataFrame,为所有数据创建一个大DataFrame。假设我们有3个分片,每个分片有500万行,那么将所有分片垂直堆叠后,最终的DataFrame将有1500万行。下面的代码展示了如何在Pandas中纵向连接DataFrame。#Verticalconcatpd.concat([october_df,november_df,december_df],axis=0)您可以按列而不是行拆分数据集,做类似的事情-每个CSV文件都有几列(包含所有OK)。就像我们把数据集的特征分成不同的分片一样。然后,您可以水平堆叠它们以合并这些列/特征。#Horizo??ntalconcatpd.concat([features_1to5_df,features_6to10_df,features_11to15_df],axis=1)merge和merge更复杂但更强大,以类似SQL的方式合并PandasDataFrame,即DataFrame会通过一个公共属性连接起来。假设您有两个描述YouTube频道的DataFrame。其中一个包含用户ID列表和每个用户在频道上花费的总时间。另一个包含类似的用户ID列表以及每个用户观看了多少视频。合并允许我们通过匹配用户ID将两个DataFrame合并为一个,然后将每个用户的ID、花费的时间和视频数量分组到一行中。在Pandas中合并两个DataFrame是通过merge函数完成的。您可以在下面的代码中看到它是如何工作的。left和right参数指的是要合并的两个DataFrame,而on指定用于匹配的列。pd.merge(left=ids_and_time_df,right=ids_and_videos_df,on="id")为了进一步模拟SQL连接,how参数允许您选择要执行的类SQL连接类型:内部、外部、左侧或右侧。有关SQL联接的详细信息,请参阅W3Schools教程(https://www.w3schools.com/sql/sql_join.asp)。(3)ReshapeDataFrame有几种方法可以对PandasDataFrame进行reshape和重组。有简单易行的方法,也有强大复杂的方法。让我们来看看三种最常见的方法。对于以下所有示例,我们将使用这个超级英雄数据集!importpandasaspdplayers_data={'玩家':['超人','蝙蝠侠','灭霸','蝙蝠侠','灭霸','超人','蝙蝠侠','灭霸','黑寡妇','蝙蝠侠','灭霸','超人'],'年份':[2000,2000,2000,2001,2001,2002,2002,2002,2003,2004,2004,2005],'积分':[23,43,45,65,76,34,23,78,89,76,92,87]}df=pd.DataFrame(players_data)print(df)"""PlayerYearPoints0Superman2000231Batman2000432Thanos2000453Batman2001654Thanos2001765Superman2002346Batman2002237Thanos2002788BlackWidow2003899Batman20047610Thanos20049211Superman200587"""转置转置是其中最简单的。Transposeswapstherows和DataFrame的列。如果你有5000行和10列,那么在转置你的DataFrame之后,你最终会得到10行和5000列。importpandasaspdplayers_data={'玩家':['超人','蝙蝠侠','灭霸','蝙蝠侠','灭霸','超人','蝙蝠侠','灭霸','黑寡妇','蝙蝠侠','灭霸','超人'],'年份':[2000,2000,2000,2001,2001,2002,2002,2002,2003,2004,2004,2005],'积分':[23,43,45,65,76,34,23,78,89,76,92,87]}df=pd.DataFrame(players_data)print(df)"""PlayerYearPoints0Superman2000231Batman2000432Thanos2000453Batman2001654Thanos2001765Superman2002346Batman2002237Thanos2002788BlackWidow2003899Batman20047610Thanos20049211Superman200587"""GroupbyGroupby的主要用途是根据一些键将DataFrame分成多个部分.DataFrame被拆分成多个部分后,您可以进行遍历并独立地对每个部分执行一些操作。例如,我们可以从下面的代码中看到如何创建具有相应年份和积分的球员的DataFrame。然后我们执行groupby以根据玩家将DataFrame分成多个部分。因此,每个玩家都有自己的组,显示该玩家每年因玩游戏而获得的积分。groups_df=df.groupby('Player')forplayer,groupgroups_df:print("-----{}-----".format(player))print(group)print("")###Thisprintsoutthefollowing"""-----Batman-----PlayerYearPoints1Batman2000433Batman2001656Batman2002239Batman200476-----BlackWidow-----PlayerYearPoints8BlackWidow200389-----Superman-----PlayerYearPoints0Superman2000235Superman20023411Superman200587-----Thanos-----PlayerYearPoints2Thanos2000454Thanos2001767Thanos20027810Thanos200492"""StackingStacking将DataFrame转换为多级索引,即每一行都有多个子部分。这些子部分是使用DataFrame的列创建的,并压缩到一个多索引中。总的来说,堆叠可以被认为是将列压缩成多索引行。这可以通过一个例子来说明,如下所示。df=df.stack()print(df)"""0PlayerSupermanYear2000Points231PlayerBatmanYear2000Points432PlayerThanosYear2000Points453PlayerBatmanYear2001Points654PlayerThanosYear2001Points765PlayerSupermanYear2002Points346PlayerBatmanYear2002Points237PlayerThanosYear2002Points788PlayerBlackWidowYear2003Points899PlayerBatmanYear2004Points7610PlayerThanosYear2004Points9211PlayerSupermanYear2005Points87"""(4)处理时间数据Datetime库是Python的基本库。Aslongasyou'redealingwithanythingtodowithactualdateandtimeinformation,这是一个值得使用的图书馆。幸运的是,Pandas还具有处理Datetime对象的功能。让我举一个例子。在下面的代码中,我们首先创建一个包含4列的DataFrame:日、月、年和数据,然后按年和月进行排序。如您所见,这非常令人困惑。只是为了存储我们使用3列的日期,实际上我们知道日历日期只是一个值。fromitertoolsimportproductimportpandasasspdimportnumpyasnpcol_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)"""DayMonthYeardata010820181.685356411820180.441383812820181.27608921092018-0.260338611920180.404769101292018-0.359598110820190.14549851182019-0.73146391282019-1.45163331092019-0.98829471192019-0.687049111292019-0.067432"""我们可以用datetime来清理。Pandasnicelyshipswithafunctioncalledto_datetime()thatcancompressmultipleDataFramecolumnsand将它们转换为单个Datetime对象。一旦采用这种格式,您就可以享受Datetime库的所有灵活性。要使用to_datetime()函数,您需要将相关列中的所有“数据”数据传递给它。即“日”、“月”和“年”三列。一旦我们有了Datetime格式的内容,我们就不再需要其他列了,只需删除它们即可。查看下面的代码,了解它们是如何工作的!fromitertoolsimportproductimportpandasasspdimportnumpyasnpcol_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)"""datedata02018-08-10-0.32897342018-08-11-0.67079082018-08-08-12-1.36056522018-09-09-09-0.40197362018-09-11-11.238754102018-09-09-09-120.95769512012012019-9-08-100.5711220191220191919191191191191911919111911911911191111911191119111911191119191911191919191919999.1911191119111911919191919199转-1.71780072019-09-110.074606112019-09-12-0.643198"""(5)项目到组的映射是帮助组织分类数据的巧妙技巧。例如,假设我们有一个包含数千行的巨大DataFrame,其中一列包含我们要分类的项目。这样做可以大大简化训练机器学习模型并有效地可视化数据。查看下面的代码,了解我们要排序的食物列表的一个小示例。importpandasaspdfoods=pd.Series(["面包","米饭","牛排","火腿","鸡肉","苹果","土豆","芒果","鱼","面包","米饭""牛排","火腿","鸡肉","苹果","土豆","芒果","鱼","苹果","土豆","芒果","鱼","苹果",土豆”,“芒果”,“鱼”,“面包”,“米饭”,“牛排”,“火腿”,“鸡肉”,“面包”,“米饭”,“牛排”,“火腿”,“鸡肉”"面包","米饭","牛排","火腿","鸡肉","苹果","土豆","芒果","鱼","苹果","土豆","芒果",鱼","苹果","土豆","芒果","鱼","面包","米饭","牛排","火腿","鸡肉","面包","米饭","牛排","火腿","鸡肉",])groups_dict={"蛋白质":["牛排","火腿","鸡肉","鱼"],"碳水化合物":["面包","大米","苹果","土豆","Mangoes"]}在上面的代码中,我们将列表放入PandasSeries我们还创建了一个字典来显示所需的映射,将每个食物分类为“蛋白质”或“碳水化合物”。这是一个暂定的例子,但是如果系列很大,比方说1,000,000项,那么对其进行迭代根本不可行。而不是使用Basicfor循环。查看下面的代码以查看函数及其使用方法。在这个函数中,我们首先迭代字典以创建一个新字典,其中的键代表Pandas系列中的每个可能的项目,值代表新的映射项目:“蛋白质”或“碳水化合物”。然后我们简单地使用Pandas内置的map函数来映射系列中的所有值。查看下面的输出以查看结果!['碳水化合物','碳水化合物','蛋白质','蛋白质','蛋白质','碳水化合物','碳水化合物','碳水化合物','蛋白质','碳水化合物','碳水化合物','蛋白质','蛋白质'、'蛋白质'、'碳水化合物'、'碳水化合物'、'碳水化合物'、'蛋白质'、'碳水化合物'、'碳水化合物'、'碳水化合物'、'蛋白质'、'碳水化合物'、'碳水化合物'、'碳水化合物','蛋白质','碳水化合物','碳水化合物','蛋白质','蛋白质','蛋白质','碳水化合物','碳水化合物','蛋白质','蛋白质','蛋白质','碳水化合物','“碳水化合物”、“蛋白质”、“蛋白质”、“蛋白质”、“碳水化合物”、“碳水化合物”、“碳水化合物”、“蛋白质”、“碳水化合物”、“碳水化合物”、“碳水化合物”、“蛋白质”、“碳水化合物”,'碳水化合物','碳水化合物','蛋白质','碳水化合物','碳水化合物','蛋白质','蛋白质','蛋白质','碳水化合物','碳水化合物','蛋白质','蛋白质','Protein']原标题:Pandas的5个高级特性及其使用方法,作者:GeorgeSeif
