人生苦短,我用Python上一篇传送门:小白学Python数据分析(1):数据分析基础小白学Python数据分析(2)):Pandas(一)概述小白学Python数据分析(三):Pandas(二)数据结构系列小白学Python数据分析(四):Pandas(三)数据结构DataFrame小白学Python数据分析(五):Pandas(4)基本操作(1)查看数据小白学习Python数据分析(6):Pandas(5)基本操作(2)数据选择小白学习Python数据分析(7):Pandas(6)数据导入小白学习Python数据分析(8):Pandas(7)数据预处理小白学Python数据分析(9):Pandas(8)数据预处理(2)小白学Python数据分析(10):Pandas(9)数据操作小白学Python数据分析(11):Pandas(10)数据分组介绍前面我们介绍了数据分组,今天我们就来介绍一个和数据分组很相似的内容,就是数据透视表。从名字上看,没有半毛钱的感觉。事实上,并非如此。数据分组是从一维(行)的角度对数据进行拆分。如果我们要从两个维度(行和列)的角度来拆分数据,那么拆分数据呢?这就需要用到我们今天的主角,数据透视表了。数据透视表什么是数据透视表?小编灵魂画手上线:画的不好,同学们可以凑合一下。在Excel中,实际上有数据透视表这样的东西。选择完insert中的所有数据后,点击pivottable,会出现这样的画面:点击确定后,会出现这样的画面:excel中如何使用,大家可以百度一下。毕竟,这是讨论Python的地方。Excel的操作就不多说了。Pandas的操作与Excel的使用非常相似。在Pandas中,pivot_table()方法用于实现数据透视表。首先放一个公文,防止同学们发现。官方文档地址:https://pandas.pydata.org/pan...。再看pivot_table的语法:pandas.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All',observed=False)→'DataFrame'数据:要透视的整个表值:要聚合的数据项索引:要在透视表上分组的键索引列:要在透视表列上分组的键aggfunc:true计算类型ofvaluesfill_value:空值的填充值margins:是否显示总dropna:是否删除缺失,如果不删除则删除缺失数据的行margins_name:总类的列名下面看例子,数据集还是使用了上一篇文章使用的流行病数据集,我们来看一个简单的例子。我们按照七大洲来看目前的确诊情况:importpandasaspd#dataimportepidemic_dxy=pd.read_excel("epidemic_dxy.xlsx")df=pd.pivot_table(epidemic_dxy,values='currentConfirmedCount',index='continents',aggfunc='sum')print(df)#输出内容currentConfirmedCountcontinentsAsia5458Others699NorthAmerica99SouthAmerica8Oceania14Europe2040Africa3可以看到,这和我们直接按七大洲分组的结果是一致的上一篇文章。本例中的currentConfirmedCount是我们要统计的值,continents是我们要拆分的索引,aggfunc中的sum是我们统计需要统计的值的方式。这里只是一维拆分,与分组没有实际区别。接下来我们将数据进行二维方向的拆分:importpandasaspd#Dataimportepidemic_dxy=pd.read_excel("epidemic_dxy.xlsx")df1=pd.pivot_table(epidemic_dxy,values='currentConfirmedCount',index='continents',columns='provinceName',aggfunc='sum')print(df1)#outputprovinceNameDenmarkArmeniaIsraelIraqIran...OmanUAEKoreaMalaysiaLebanoncontinents...AsiaNaN1.09.019.0749.0...5.016.04283.011.03.0其他NaNNaNNaNNaNNaN...NaNNaNNaNNaNNaN北美NaNNaNNaNNaNNaN...NaNNaNNaNNaNNaN南美洲NaNNaNNaNNaNNaN...NaNNaNNaNNaNNaN大洋洲NaNNaNNaNNaNNaN...NaNNaNNaNNaNNaN欧洲3.0NaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaN非洲NaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaN[7行x65栏】因为内容较多,所以大部分内容都折叠起来了。在上面的例子中,我们将整个数据表按照七大洲和国家进行了横向和纵向的拆分。可以看到整个表中会有很多列为Null值,以Asia这一行为例,因为我们原始数据中亚洲只有26个国家,所以理论上应该只有Asia中的那26个国家排亚,其实就是这样。那么,现在有一个简单的小问题,如果我想知道每条数据的创建时间(createTime字段),这样也可以吗?当然,pivot_table支持在水平和垂直拆分时传入一个数组。如下,我们给索引增加一个新的参数createTime:importpandasaspd#Dataimportepidemic_dxy=pd.read_excel("epidemic_dxy.xlsx")df2=pd.pivot_table(epidemic_dxy,values='currentConfirmedCount',index=['大陆','createTime'],columns='provinceName',aggfunc='sum')print(df2)#outputprovinceNameDenmarkArmeniaIsraelIraq...UAEKoreaMalaysiaLebanoncontinentscreateTime...Asia1583138990000NaNNaN9.019.0...16.04283.011.03.01583138991000NaN1.0NaNNaN...NaNNaNNaNNaN其他158313899NNaNNaNaNa...NaNaN北美1583138990000NaNNaNNaNNaN...NaNNaNNaNNaN15831389910NNNaNNaN.NaN.NaN...NaNNaNNaNNaN南美洲1583138990000NaNNaNNaNNaN...NaNNaNNannnan1583138991000nannannannannan...nannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannannanNaNNaNAfrica1583138990000NaNNaNNaNNaN...NaNNaNNaNNaN[11rowsx65columns]这样,我们就得到了一个新的DataFrame,按照三个规则进行水平和垂直分割。当然这个DataFrame目前还不是标准的DataFrame,只需要最后一步,使用reset_index()重新设置索引,这里就不演示了,今天的内容比较短,但是对于第一次接触的同学我理解,建议找一个数据集多尝试,或者先在Excel中试一下,再用Python去理解。在数据透视表中,获取数据透视表并不难。难点在于我们要建立什么样的新数据表,我们真正想要得到什么样的数据。示例代码是老规矩,所有示例代码都会上传到代码管理仓库Github和Gitee,方便大家使用。示例代码-Github示例代码-Gitee如果我的文章对你有帮助,请扫码关注作者的公众号:获取最新干货推送:)
