教程地址:joyful-pandas/第4章 变形——datawhalechina
Pandas变形
四、问题与练习
问题
【问题一】 上面提到了许多变形函数,如melt/crosstab/pivot/pivot_table/
stack/unstack函数,请总结它们各自的使用特点。
- pivot函数
pivot函数可将某一列作为新的cols
但不允许values中出现重复的行列索引对 - pivot_table函数
有分组功能
可以通过aggfunc参数对组内数据进行聚合统计,可传入各类函数
可以通过margins参数汇总边际状态
行,列,值都可以为多级
但是速度上比不上原来的pivot函数 - crosstab函数
支持分组,可用于分组统计,但不支持多级分组
可以通过normalize参数进行数据归一化,也可以汇总边际状态 - melt函数
相当于pivot函数的逆操作,将unstacked状态的数据,压缩成stacked - stack函数
可看做将横向的索引放到纵向,将通过pivot_table函数压缩的数据展开成stack,参数level可指定变化的列索引是哪一层 - unstack函数
stack的逆函数,功能上类似于pivot_table()函数
【问题二】 变形函数和多级索引是什么关系?哪些变形函数会使得索引维数变化?具体如何变化?
- 可以通过设置变形函数的index和values参数来生成多级索引
- stack,unstack
【问题三】 请举出一个除了上文提过的关于哑变量方法的例子。
df_dd = pd.get_dummies(df[['School','Address']]).join(df['Physics'])
print(df_dd.head())
结果
School_S_1 School_S_2 ... Address_street_7 Physics
ID ...
1101 1 0 ... 0 A+
1102 1 0 ... 0 B+
1103 1 0 ... 0 B+
1104 1 0 ... 0 B-
1105 1 0 ... 0 B+
[5 rows x 9 columns]
【问题四】 使用完stack后立即使用unstack一定能保证变化结果与原始表完全一致吗?
不能,结果不一致
【问题五】 透视表中涉及了三个函数,请分别使用它们完成相同的目标(任务自定)并比较哪个速度最快。
df.pivot(index='ID',columns='Class')
pd.pivot_table(df,index='ID',columns='Class')
pd.crosstab(index=df['ID'],columns=df['Class'])
结果:
pivot: 0.02886176109313965 s
pivot_table: 0.044981956481933594 s
crosstab: 0.03425192832946777 s
【问题六】 既然melt起到了stack的功能,为什么再设计stack函数?
stack函数的参数level可指定变化的列索引是哪一层,dropna用于去掉缺失数据
- 练习
【练习一】 继续使用上一章的药物数据集:
(a) 现在请你将数据表转化成如下形态,每行需要显示每种药物在每个地区的10年至17年的变化情况,且前三列需要排序:
(b) 现在请将(a)中的结果恢复到原数据表,并通过equal函数检验初始表与新的结果是否一致(返回True)
【练习二】 现有一份关于某地区地震情况的数据集,请解决如下问题:
(a) 现在请你将数据表转化成如下形态,将方向列展开,并将距离、深度和烈度三个属性压缩:
(b) 现在请将(a)中的结果恢复到原数据表,并通过equal函数检验初始表与新的结果是否一致(返回True)