学习笔记,这个笔记以例子为主。
开发工具:Spyder
Pandas透视表
透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行分组聚合,并对每个分组进行数据汇总。
- 语法
# 以A与B做分组汇总数据,针对D的每个值列级分组统计,统计每个分组下C列的最大值,并添加行、列小计
data.pivot_table(index=['A', 'B'], values=['C'],
columns=['D'], margins=True, aggfunc='max')
接下来,我们用几个例子来学习如何用pandas来制作想要的数据透视表。
首先,我们来康康接下来几个例子所要使用的数据:
代码:
import pandas as pd
leftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee',
'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],
'gender':['M', 'F', 'M', 'M', 'M',
'F', 'M', 'M', 'M', 'F'],
'Bunny_id':[1, 2, 3, 4, 2, 4, 3, 1, 4, 5]}
rightD = {'Bunny_id':[1, 2, 3, 4, 5],
'foods':['A', 'B', 'C', 'D', 'E']}
df_leftD = pd.DataFrame(leftD)
df_rightD = pd.DataFrame(rightD)
df = pd.merge(df_leftD, df_rightD, how = 'outer')
print(df)
数据:
Bunny_id age gender name weight foods
0 1 9 M Ada 8 A
1 1 9 M Peter 5 A
2 2 9 F Tom 4 B
3 2 10 M Lee 10 B
4 3 10 M Black 5 C
5 3 8 M Blue 4 C
6 4 10 M Jack 6 D
7 4 10 F Yellow 10 D
8 4 7 M Green 4 D
9 5 8 F Trump 8 E
- 例子1
代码:
#以Bunny_id做分组汇总数据,默认统计所有列的均值
print(df.pivot_table(index=['Bunny_id']))
结果:
age weight
Bunny_id
1 9.0 6.500000
2 9.5 7.000000
3 9.0 4.500000
4 9.0 6.666667
5 8.0 8.000000
由结果可知,由于除了Bunny_id这个变量以外,只有age和weight为数值型变量,故pandas计算了age和weight的均值。
- 例子2
代码:
#以Bunny_id与gender做分组汇总数据,默认统计所有列的最大值
print(df.pivot_table(index=['Bunny_id', 'gender'], aggfunc='max'))
结果:
age foods name weight
Bunny_id gender
1 M 9 A Peter 8
2 F 9 B Tom 4
M 10 B Lee 10
3 M 10 C Blue 5
4 F 10 D Yellow 10
M 10 D Jack 6
5 F 8 E Trump 8
由结果可知,pandas先按照Bunny_id进行分组,再按照gender进行分组。最后对分组结果,分别计算age、foods、name、weight的最大值。
- 例子3
代码:
#以Bunny_id与gender做分组汇总数据,统计age列的均值
print(df.pivot_table(index=['Bunny_id', 'gender'], values=['age']))
结果:
age
Bunny_id gender
1 M 9.0
2 F 9.0
M 10.0
3 M 9.0
4 F 10.0
M 8.5
5 F 8.0
由结果可知,pandas先对Bunny_id和gender进行分组,并只显示age的分组平均值。
- 例子4
代码:
#以Bunny_id与gender做分组汇总数据,针对weight的每个值列级分组,统计age列的均值。
print(df.pivot_table(index=['Bunny_id', 'gender'],
values=['age'], columns=['weight']))
结果;
age
weight 4 5 6 8 10
Bunny_id gender
1 M NaN 9.0 NaN 9.0 NaN
2 F 9.0 NaN NaN NaN NaN
M NaN NaN NaN NaN 10.0
3 M 8.0 10.0 NaN NaN NaN
4 F NaN NaN NaN NaN 10.0
M 7.0 NaN 10.0 NaN NaN
5 F NaN NaN NaN 8.0 NaN
由结果可知,Bunny_id和gender的组合作为行,weight作为列,共同构造了二维表,表中值为每个分组中age的平均值,如果对应分组没有值,则该位置用NaN代替。
Pandas交叉表
交叉表(cross-tabulation, 简称crosstab)是一种用于计算分组频率的特殊透视表
- 语法
# 按照A列的观测值进行分组,针对不同的B,统计频数
pd.crosstab(data.A, data.B, margins=True)
- 例子(接上面透视表案例中的数据)
代码:
print(pd.crosstab(df.gender, df.foods))
结果:
foods A B C D E
gender
F 0 1 0 1 1
M 2 1 2 2 0