当前位置:网站首页 > Python编程 > 正文

python pivot函数(python pivot table aggfunc)



数据透视表将每一列数据作为输入,输出将数据不断细分成多个维度累计信息的二维数据表。在实际数据处理过程中,数据透视表使用频率相对较高,今天云朵君就和大家一起学习pandas数据透视表与逆透视的使用方法。

本次使用的数据来源于Kaggle,车辆被警察拦下并进行搜查记录数据集,简称车辆数据。

数据基本情况

逆透视变换ipm python实现_逆透视变换ipm python实现

groupby数据透视表

使用 pandas.DataFrame.groupby 函数,其原理如下图所示。

逆透视变换ipm python实现_python_02

使用车辆数据集统计不同性别司机的平均年龄,聚合后用二维切片可以输出DataFrame数据框。

逆透视变换ipm python实现_数据分析_03

在聚合后一维切片会得到 pandas.Series.

可能还想进一步探索,同时观察不同司机性别与司机种族的平均年龄。根据 GroupBy 的操作流程,我们也许能够实现想要的结果:将司机种族('driver_race')与司机性别('driver_gender')分组,然后选择司机年龄('driver_age')列,应用均值('mean')累计函数,再将各组结果组合,最后通过行索引转列索引操作将最里层的行索引转换成列索引,形成二维数组。

逆透视变换ipm python实现_大数据_04

通过unstack重排数据表

如果原表只有一级索引,unstack就将每一个列都分出来,然后全部纵向叠加在一起,每一个列名作为新的一级索引,原本的索引作为二级索引。如果原表有二级索引,那么unstack就会将二级索引作为新的列名,一级索引作为新的索引。

逆透视变换ipm python实现_python_05

pivot_table

虽然这样就可以更清晰地观察出不同司机性别与司机种族的平均年龄,但代码有点复杂。要理解这个长长的语句可不是那么容易的事。

由于二维的 GroupBy 应用场景非常普遍,因此 Pandas 提供了一个快捷方式 pivot_table 来快速解决多维的累计分析任务。

同样是上面的需求,同时观察不同司机性别与司机种族的平均年龄 ,用pivot_table实现透视表。

逆透视变换ipm python实现_逆透视变换ipm python实现_06

多级数据透视表

与 GroupBy 类似,数据透视表中的分组也可以通过各种参数指定多个等级。

行索引和列索引都可以再设置为多层,不过行索引和列索引在本质上是一样的,大家需要根据实际情况合理布局。

逆透视变换ipm python实现_python_07

自定义聚合函数

aggfunc 参数用于设置累计函数类型,默认值是均值(mean)。累计函数可以用一些常见的字符串 ('sum'、'mean'、'count'、'min'、'max' 等)表示,也可以用标准的累计函数(np.sum()、min()、sum() 等)。

还可以通过字典为不同的列指定不同的累计函数。

  • 如果传入参数为list,则每个聚合函数对每个列都进行一次聚合。
  • 如果传入参数为dict,则每个列仅对其指定的函数进行聚合, 此时values参数可以不传。

逆透视变换ipm python实现_python_08

这里没有使用参数 values。其实在我们通过字典为 aggfunc 指定映射关系的时候,待透视的数值就已经确定了。

margin 的标签可以通过 margins_name 参数进行自定义, 默认值是 "All"。

下面按行、按列进行汇总,指定汇总列名为“Total”

逆透视变换ipm python实现_数据挖掘_09

pandas.crosstab

crosstab 是交叉表,是一种特殊的数据透视表默认是计算分组频率的特殊透视表(默认的聚合函数是统计行列组合出现的次数)。如果指定了聚合函数则按聚合函数来统计,但是要指定values的值,指明需要聚合的数据。

pandas.crosstab 参数

index:指定了要分组的列,最终作为行。
columns:指定了要分组的列,最终作为列。
values:指定了要聚合的值(由行列共同影响),需要指定aggfunc参数。
rownames:指定了行名称。
colnames:指定了列名称。
aggfunc:指定聚合函数。必须指定values的值。
margins:布尔值,是否分类统计。默认False。
margins_name:分类统计的名称,默认是"All"。
dropna:是否包含全部是NaN的列。默认是True。

逆透视变换ipm python实现_python_10

如果说 将长数据集转换成宽数据集, 则是将宽数据集变成长数据集  既是顶级类函数也是实例对象函数,作为类函数出现时,需要指明  的名称

pd.melt 参数

frame 被 melt 的数据集名称在 pd.melt() 中使用
id_vars 不需要被转换的列名,在转换后作为标识符列(不是索引列)
value_vars 需要被转换的现有列,如果未指明,除 id_vars 之外的其他列都被转换
var_name 自定义列名名称,设置由 'value_vars' 组成的新的 column name
value_name 自定义列名名称,设置由 'value_vars' 的数据组成的新的 column name
col_level 如果列是MultiIndex,则使用此级别

逆透视变换ipm python实现_数据挖掘_11

逆透视变换ipm python实现_大数据_12

为方便下面转换的理解,经过去除columns的name后得到:

逆透视变换ipm python实现_大数据_13

下面开始进行转换。保留"driver_gender",对剩下列全部转换,并给设置对列定义列名。

逆透视变换ipm python实现_数据挖掘_14

上述同样的结果用groupby也可以做到,如下所示。

逆透视变换ipm python实现_大数据_15

这里补充说明下去除columns的name及index的name的方法。

如下图所示"driver_race" 和 "driver_gender" 分别是columns的name,index的name。

逆透视变换ipm python实现_数据分析_16

下面演示一个平时较为头疼的事情。即将两个name删掉。下面介绍一个常见的方法。

使用pandas.DataFrame.rename_axis去除columns列的名称

逆透视变换ipm python实现_数据挖掘_17

另外一种情况如下图所示,在column上还有一个"driver_age",此时需要在第一步使用pandas.DataFrame.droplevel把"driver_age"删除:df.columns = df.columns.droplevel(0)

逆透视变换ipm python实现_逆透视变换ipm python实现_18

然后在执行上面两步。

到此这篇python pivot函数(python pivot table aggfunc)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • Python根据安装包安装selenium2024-12-26 20:36:06
  • 关于msms、biopython_residuedepth.py学习2024-12-26 20:36:06
  • 不用备案的vps国内推荐2024-12-26 20:36:06
  • python——图片爬虫:爬取爱女神网站(www.znzhi.net)上的妹子图 进阶篇2024-12-26 20:36:06
  • Python爬取豆瓣裤袜视界高清大图2024-12-26 20:36:06
  • Python函数递归调用(python 递归调用)2024-12-26 20:36:06
  • sigmoid函数输出范围(sigmoid函数python)2024-12-26 20:36:06
  • python 字典 增加(python字典增加元素代码)2024-12-26 20:36:06
  • python 函数的类型(python函数有哪几类)2024-12-26 20:36:06
  • python 函数的类型(python中的函数包括)2024-12-26 20:36:06
  • 全屏图片