感谢datawhale开展的每月组队学习,教材ref: 第五章:变形
长宽表的变形
df.pivot()
datawhale这几个图解画的太优秀了!!爱了爱了
单列pivot操作
多列pivot操作
df.pivot_table()
df.melt()
pd.wide_to_long()
索引的变形
其他变形函数
练一练
Ex1:美国非法药物数据集
现有一份关于美国非法药物的数据集,其中 SubstanceName
, DrugReports
分别指药物名称和报告数量:
In [63]: df = pd.read_csv('data/drugs.csv').sort_values([
....: 'State','COUNTY','SubstanceName'],ignore_index=True)
....:
In [64]: df.head(3)
Out[64]:
YYYY State COUNTY SubstanceName DrugReports
0 2011 KY ADAIR Buprenorphine 3
1 2012 KY ADAIR Buprenorphine 5
2 2013 KY ADAIR Buprenorphine 4
- 将数据转为如下的形式:
df.pivot_table(index = ['State','COUNTY','SubstanceName'], columns = 'YYYY', values = 'DrugReports', aggfunc='sum').reset_index()
- 将第1问中的结果恢复为原表。
a.melt(id_vars=['State','COUNTY','SubstanceName'], value_vars=a.columns[-8:], var_name='YYYY', value_name='DrugReports').dropna(subset=['DrugReports'])
- 按
State
分别统计每年的报告数量总和,其中State
,YYYY
分别为列索引和行索引,要求分别使用pivot_table
函数与groupby+unstack
两种不同的策略实现,并体会它们之间的联系。
df.pivot_table(index='YYYY', columns='State', values='DrugReports', aggfunc='sum')
Ex2:特殊的wide_to_long方法
从功能上看, melt
方法应当属于 wide_to_long
的一种特殊情况,即 stubnames
只有一类。请使用 wide_to_long
生成 melt
一节中的 df_melted
。(提示:对列名增加适当的前缀)
In [65]: df = pd.DataFrame({'Class':[1,2],
....: 'Name':['San Zhang', 'Si Li'],
....: 'Chinese':[80, 90],
....: 'Math':[80, 75]})
....:
In [66]: df
Out[66]:
Class Name Chinese Math
0 1 San Zhang 80 80
1 2 Si Li 90 75
啊?