Python数据分析pandas之分组统计透视表
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Python数据分析pandas之分组统计透视表,希望能够帮助大家进步!!!
数据聚合统计
Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小)、max(最大)、avg(平均值)、sum(求和)、var()、std(标准差)、百分位数、中位数等。
数据框概览
可以通过describe方法查看当前数据框里数值型的统计信息,主要包括条数、均值、标准差、最小值、25分位数、50分位数、75分位数、最大值方面的信息。
如果是查看某列的统计信息,在数据框下加“.”列名即可。
代码语言:javascript复制import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90],["王二",19,'B',78],["王三",34,'C',55],["刘七",35,'A',91]],columns=['name','age','level','score'],index=['no_001','no_002','no_003','no_006'])
#查看所有数值列数据概况
print(df2.describe())
#查看age列的数据概况
print(df2.age.describe())
# 当然也可以指定percentiles,比如这里仅显示百分之30、50分位数。
# print(df2.describe(percentiles=[0.3,0.5]))
#结果
age score
count 4.000000 4.000000
mean 30.000000 78.500000
std 7.438638 16.743158
min 19.000000 55.000000
25% 28.750000 72.250000
50% 33.000000 84.000000
75% 34.250000 90.250000
max 35.000000 91.000000
count 4.000000
mean 30.000000
std 7.438638
min 19.000000
25% 28.750000
50% 33.000000
75% 34.250000
max 35.000000
Name: age, dtype: float64
单独查看统计信息
代码语言:javascript复制此代码由Java架构师必看网-架构君整理
import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90],["王二",19,'B',78],["王三",34,'C',55],["刘七",35,'A',91]],columns=['name','age','level','score'],index=['no_001','no_002','no_003','no_006'])
#查看所有数值列数据详情,分开统计
print(df2.age.count(),df2.age.mean(),df2.age.std(),df2.age.min(),df2.age.quantile(0.25),df2.age.quantile(0.5),df2.age.quantile(0.75),df2.age.sum())
#结果
4 30.0 7.438637868140466 19 28.75 33.0 34.25 120
按照某一列分组统计
代码语言:javascript复制#这里按照等级列进行分组,以求最大值为例,其它的聚合函数类似。
import pandas as pd df2=pd.DataFrame([["李四",32,'A',90],["王二",19,'B',78],["王三",34,'C',55],["刘七",35,'A',91],["麻六",34,'A',83]],columns=['name','age','level','score'],index=['no_001','no_002','no_003','no_004','no_005'])
#查看等级列的聚合(最大值)情况
print(df2.groupby('level').max())
#结果
name age score
level
A 麻六 35 91
B 王二 19 78
C 王三 34 55
按照多列分组统计
多列(两列以上)分组统计,当前以等级、排名列为例,聚合函数是最大值(max)。
代码语言:javascript复制此代码由Java架构师必看网-架构君整理
import pandas as pd df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005']) # 按照默认列分组取最大值
#print(df2.groupby(['level','rn']).max())
##指定列(age)分组取最大值 print(df2.groupby(['level','rn']).age.max()) #print(df2.groupby(['level','rn'])['age'].max())#等同于上式
#结果
name age score income bouns level rn A 2
李四 32 90 1500 300 3
麻六 35 91 1000 400 B 2
王二 19 78 1300 200 C 1
王三 34 55 1250 235
level rn
A 2 32
3 35
B 2 19
C 1 34
Name: age, dtype: int64
分组统计结合APPLY
通过APPLY结合lambda表达式生成新列,生成的对象是Series,如有需要可以转换为DataFrame。
代码语言:javascript复制import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005'])
#通过APPLY结合lambda表达式生成新列
df_apply = pd.DataFrame(df2.groupby(['level', 'rn'], as_index=False).apply(lambda x: sum(x['income'])/sum(x['income'] x['bouns'])),columns=['rate'])
df_fin= df_apply.reset_index()
print(df_fin)
#结果,这里level和rn是索引。
rate
level rn
A 2 0.833333
3 0.791667
B 2 0.866667
C 1 0.841751
分组统计结合APPLY与索引重建
通过APPLY结合lambda表达式生成新列,生成的对象是Series,因为groupby里的分组字段会转为索引,要变为列,需要通过reset_index方法。
代码语言:javascript复制import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005'])
#通过APPLY结合lambda表达式生成新列
df_apply = pd.DataFrame(df2.groupby(['level', 'rn'], as_index=False).apply(lambda x: sum(x['income'])/sum(x['income'] x['bouns'])),columns=['rate'])
df_fin= df_apply.reset_index()
print(df_fin)
#结果
level rn rate
0 A 2 0.833333
1 A 3 0.791667
2 B 2 0.866667
3 C 1 0.841751
透视表pivot_table
通过pivot_table实现以姓名(name)为索引,不同级别最小值(min)、收入(income)总和为列的交叉表。
代码语言:javascript复制import pandas as pd df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005']) print(df2.pivot_table(index='name',columns=["level"],aggfunc={'age':max,'income':sum}))
#结果
age income level
A B C A B C
name
刘七 35.0 NaN NaN 1000.0 NaN NaN
李四 32.0 NaN NaN 1500.0 NaN NaN
王三 NaN NaN 34.0 NaN NaN 1250.0
王二 NaN 19.0 NaN NaN 1300.0 NaN
麻六 34.0 NaN NaN 900.0 NaN NaN