Python-Groupby函数应用

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
	
  • 20
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值