写在前面
本文内容来源于Datawhale组队学习教程
第4章 变形
import numpy as np
import pandas as pd
df = pd.read_csv('data/table.csv')
df.head()
一、透视表
- pivot
一般状态下,数据在DataFrame会以压缩(stacked)状态存放,例如上面的Gender,两个类别被叠在一列中,pivot函数可将某一列作为新的cols
然而pivot函数具有很强的局限性,除了功能上较少之外,还不允许values中出现重复的行列索引对(pair),例如下面的语句就会报错:
#df.pivot(index='School',columns='Gender',values='Height').head()
因此,更多的时候会选择使用强大的pivot_table函数
2. pivot_table
首先,再现上面的操作:
pandas中提供了各种选项,下面介绍常用参数:
① aggfunc:对组内进行聚合统计,可传入各类函数,默认为’mean’
② margins:汇总边际状态
③ 行、列、值都可以为多级
- crosstab(交叉表)
交叉表是一种特殊的透视表,典型的用途如分组统计,如现在想要统计关于街道和性别分组的频数:
交叉表的功能也很强大(但目前还不支持多级分组),下面说明一些重要参数:
① values和aggfunc:分组对某些数据进行聚合操作,这两个参数必须成对出现
② 除了边际参数margins外,还引入了normalize参数,可选’all’,‘index’,'columns’参数值
二、其他变形方法
- melt
melt函数可以认为是pivot函数的逆操作,将unstacked状态的数据,压缩成stacked,使“宽”的DataFrame变“窄”
【问题一】 上面提到了许多变形函数,如melt/crosstab/pivot/pivot_table/stack/unstack函数,请总结它们各自的使用特点。
pivot:将属性A设置为索引,将属性B的值域作为新的列,将属性C作为取值,要求对任意索引和列的组合,最多只能有一个属性C的值
pivot_table:相对于privot,前面的操作一样,不过专门用于对任意索引和列的组合,可能有多个属性C的值的情况:aggfunc为统计函数参数,默认取平均值(并且行列都可以为多级)
crosstab:将属性A作为索引,将属性B的值域做为新的列,然后进行统计:values参数为用于统计的值,默认为1;aggfunc为统计函数参数,默认为count(不支持多级分组)
melt:pivot的逆操作——将value作为新的列,将原来的列合并为一个新的属性作为列
stack:将值域合并为属性,然后将属性划分到行,或者列
unstack:stack的逆操作——将行或列的属性的值域做为新的列
【问题二】 变形函数和多级索引是什么关系?哪些变形函数会使得索引维数变化?具体如何变化?
【问题三】 请举出一个除了上文提过的关于哑变量方法的例子。
df['count']=1
df_s = pd.pivot_table(df,index=['Class','ID'],columns='Gender',values=['count'])
df_s.stack(0).unstack(0).replace(np.nan,0).head()
【问题四】 使用完stack后立即使用unstack一定能保证变化结果与原始表完全一致吗?
【问题五】 透视表中涉及了三个函数,请分别使用它们完成相同的目标(任务自定)并比较哪个速度最快。
df = pd.read_csv('data/table.csv')
%timeit df.pivot(index='ID',columns='Gender',values='Height')
%timeit pd.pivot_table(df,index='ID',columns='Gender',values='Height')
%timeit pd.crosstab(index=df['ID'],columns=df['Gender'],values=df['Height'],aggfunc='max')
【问题六】 既然melt起到了stack的功能,为什么再设计stack函数?
stack不仅可以将合并后的新属性作为列,还可以作为行