Pandas分组和聚合运算–Groupby函数应用
一、groupby函数功能
根据一个或多个键拆分pandas对象,计算分组摘要统计,如计数、平均值、标准差或用户自定义函数等。
二、groupby函数原理
可将groupby函数分组聚合的过程分为两步:
1、分组split:按照指定键值或分组变量对数据分组
2、聚合combine:应用python自带函数或自定义函数进行聚合计算
eg.
1.分组
#创建数据
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],
'key2':['one', 'two', 'one', 'two', 'one'],
'data1':np.random.randn(5),
'data2':np.random.randn(5)})
print(df)
>>>
key1 key2 data1 data2
0 a one 0.342001 -0.026749
1 a two 0.645837 -0.460551
2 b one -0.060859 0.199347
3 b two -1.043132 -0.551104
4 a one 0.312109 -1.595615
#进行拆分
grouped=df['data1'].groupby(df['key1'])
print(grouped)
>>>
<pandas.core.groupby.groupby.SeriesGroupBy object at 0x114033278>
2.聚合
这里的grouped是groupby的一个对象,实际上并没有经过任何计算,只是包含一些有关df[‘key1’]的中间数据,接下来调用聚合函数对其进行进一步计算。
#进行聚合计算
print(grouped.mean())
>>>
key1
a -0.290544
b 0.211538
Name: data1, dtype: float64
三、groupby函数应用
1、求和、标准差以及最大/小值等
print(grouped.sum())
>>>
key1
a -0.871633
b 0.423076
Name: data1, dtype: float64
print(grouped.std())
>>>
key1
a 0.274760
b 0.918468
Name: data1, dtype: float64
print(grouped.max())
>>>
key1
a -0.095071
b 0.860993
Name: data1, dtype: float64
print(grouped.min())
>>>
key1
a -0.604697
b -0.437917
Name: data1, dtype: float64
如果结合在一起写的话,应为
Dataframe[‘计算列名’].groupby(Dataframe[‘分组列名’]).函数名()
#按照key1及key2分组后,计算data1的均值
df['data1'].groupby([df['key1'],df['key2']]).mean()
>>>
key1 key2
a one 0.327055
two 0.645837
b one -0.060859
two -1.043132
Name: data1, dtype: float64
2、一次传入多个数组(类似数据透视表)
注意传入多个数组时的写法
#按照key1及key2进行分组,求均值
df['data1'].groupby([df['key1'],df['key2']]).mean()
>>>
key1 key2
a one 0.327055
two 0.645837
b one -0.060859
two -1.043132
Name: data1, dtype: float64
3、可以将列名用作分组
注意与传入数组时语法上的区别,此时未限定对某列值的数据进行聚合,只限定了分组的值
#根据key1中属性值进行分组计算
df.groupby('key1').mean()
>>>
data1 data2
key1
a 0.433316 -0.694305
b -0.551996 -0.175878
#根据key1及key2中属性值进行分组计算
print(df.groupby(['key1','key2']).mean())
>>>
data1 data2
key1 key2
a one 0.327055 -0.811182
two 0.645837 -0.460551
b one -0.060859 0.199347
two -1.043132 -0.551104
4、分组迭代
groupby对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)
#对groupby对象中数据进行迭代输出
for name,group in df.groupby('key1'):
print(name)
print(group)
>>>
a
key1 key2 data1 data2
0 a one 0.342001 -0.026749
1 a two 0.645837 -0.460551
4 a one 0.312109 -1.595615
b
key1 key2 data1 data2
2 b one -0.060859 0.199347
3 b two -1.043132 -0.551104
#多重键的输出
for (k1,k2),group in df.groupby(['key1','key2']):
print(k1,k2)
print(group)
>>>
a one
key1 key2 data1 data2
0 a one 0.342001 -0.026749
4 a one 0.312109 -1.595615
a two
key1 key2 data1 data2
1 a two 0.645837 -0.460551
b one
key1 key2 data1 data2
2 b one -0.060859 0.199347
b two
key1 key2 data1 data2
3 b two -1.043132 -0.551104
5、结合agg()函数对多个值进行计算
#对不同字段进行计算
.agg({'data1':'mean','data2':'sum','data3':'std'})
举例
#结合agg()函数一起使用
df.groupby(['key1','key2']).agg({'data1':'mean','data2':'std'})
>>>
data1 data2
key1 key2
a one -0.517858 0.20524
two 0.118211 NaN
b one 0.512116 NaN
two 1.218486 NaN
#对同一个字段进行多次聚合计算
#方法一:将这些函数作为列表传递
df.groupby("dummy").agg({"returns":[np.mean,np.sum]})
>>>
returns
sum mean
dummy
1 0.285 0.0285
#方法二:将这些函数作为字典传递
df.groupby('dummy').agg({'returns':{'Mean':np.mean,'Sum':np.sum}})
>>>
returns
Sum Mean
dummy
1 0.285 0.0285
6、与apply结合使用
import pandas as pd
import numpy as np
import seaborn as sns
#以小费数据集为例进行分析
tips=sns.load_dataset('tips')
#展示小费前五的数据
def top(x,n=5):
return x.sort_values(by='tip',ascending=False)[-n:]
tips.groupby('sex').apply(top)
>>>
total_bill tip sex smoker day time size sextipMean
sex
Male
43 9.68 1.32 Male No Sun Dinner 2 3.089618
235 10.07 1.25 Male No Sat Dinner 2 3.089618
75 10.51 1.25 Male No Sat Dinner 2 3.089618
237 32.83 1.17 Male Yes Sat Dinner 2 3.089618
236 12.60 1.00 Male Yes Sat Dinner 2 3.089618
Female
215 12.90 1.10 Female Yes Sat Dinner 2 2.833448
0 16.99 1.01 Female No Sun Dinner 2 2.833448
111 7.25 1.00 Female No Sat Dinner 1 2.833448
67 3.07 1.00 Female Yes Sat Dinner 1 2.833448
92 5.75 1.00 Female Yes Fri Dinner 2 2.833448