1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python数据分析pandas之分组统计透视表

Python数据分析pandas之分组统计透视表

时间:2023-01-23 04:01:03

相关推荐

Python数据分析pandas之分组统计透视表

Python数据分析pandas之分组统计透视表

数据聚合统计

Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小)、max(最大)、avg(平均值)、sum(求和)、var()、std(标准差)、百分位数、中位数等。

数据框概览

可以通过describe方法查看当前数据框里数值型的统计信息,主要包括条数、均值、标准差、最小值、25分位数、50分位数、75分位数、最大值方面的信息。

如果是查看某列的统计信息,在数据框下加“.”列名即可。

import pandas as pddf2=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]))#结果agescorecount 4.000000 4.000000mean 30.000000 78.500000std7.438638 16.743158min 19.000000 55.00000025% 28.750000 72.25000050% 33.000000 84.00000075% 34.250000 90.250000max 35.000000 91.000000count4.000000mean30.000000std 7.438638min19.00000025%28.75000050%33.00000075%34.250000max35.000000Name: age, dtype: float64

单独查看统计信息

import pandas as pddf2=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

按照某一列分组统计

#这里按照等级列进行分组,以求最大值为例,其它的聚合函数类似。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 levelA 麻六 3591 B 王二 1978 C 王三 3455

按照多列分组统计

多列(两列以上)分组统计,当前以等级、排名列为例,聚合函数是最大值(max)。

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 A2 李四 3290 1500 300 3 麻六 3591 1000 400 B2 王二 1978 1300 200 C1 王三 3455 1250 235 level rn A232 335 B219 C134 Name: age, dtype: int64

分组统计结合APPLY

通过APPLY结合lambda表达式生成新列,生成的对象是Series,如有需要可以转换为DataFrame。

import pandas as pddf2=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 A2 0.833333 3 0.791667 B2 0.866667 C1 0.841751

分组统计结合APPLY与索引重建

通过APPLY结合lambda表达式生成新列,生成的对象是Series,因为groupby里的分组字段会转为索引,要变为列,需要通过reset_index方法。

import pandas as pddf2=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 rnrate0A 2 0.8333331A 3 0.7916672B 2 0.8666673C 1 0.841751

透视表pivot_table

通过pivot_table实现以姓名(name)为索引,不同级别最小值(min)、收入(income)总和为列的交叉表。

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 ABC A B C name 刘七35.0 NaN NaN 1000.0NaNNaN 李四32.0 NaN NaN 1500.0NaNNaN 王三NaN NaN 34.0NaNNaN 1250.0 王二NaN 19.0 NaNNaN 1300.0NaN 麻六34.0 NaN NaN 900.0NaNNaN

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。