约定:
import pandas as pd
import numpy as np
GroupBy分组
对数据进行分组并对每个分组进行运算是数据分析中很重要的环节。该博客讲解了利用pandas的Groupby技术如何进行分组。下图简单介绍了分组的过程:
- 创建DataFrame对象
df1=pd.DataFrame({'Data1':np.random.randint(0,10,5),'Data2':np.random.randint(10,20,5),'key1':list('aabba'),'key2':list('xyyxy')})
df1
代码结果:
Data1 | Data2 | key1 | key2 | |
---|---|---|---|---|
0 | 5 | 15 | a | x |
1 | 2 | 15 | a | y |
2 | 6 | 17 | b | y |
3 | 9 | 16 | b | x |
4 | 9 | 13 | a | y |
- 分组特性和查看分组后的大小
.groupby()返回的是pandas的groupby对象。gr1并未进行任何计算,但它包括了接下来计算所需的数据。
gr1=df1['Data1'].groupby(df1['key1'])
print(gr1)
gr1.size()
代码结果:
<pandas.core.groupby.SeriesGroupBy object at 0x00000220D1A1EC88>
key1
a 3
b 2
Name: Data1, dtype: int64
- 根据单列来对单列分组
df1['Data1'].groupby(df1['key1']).count()
代码结果:
key1
a 3
b 2
Name: Data1, dtype: int64
- 根据单列来对多列分组
df1[['Data1','Data2']].groupby(df1['key1']).mean()
代码结果:
Data1 | Data2 | |
---|---|---|
key1 | ||
a | 5.333333 | 14.333333 |
b | 7.500000 | 16.500000 |
- 根据多列对单列分组
注意,下例通过两列分组得到的是多级索引的Series对象,groupby()里面分组顺序不同而结果不同。
df1['Data1'].groupby([df1['key1'],df1['key2']]).count()
代码结果:
key1 key2
a x 1
y 2
b x 1
y 1
Name: Data1, dtype: int64
- 根据多列对多列分组
下例通过两列分组得到的是多级索引的DataFrame对象。
df1.groupby([df1['key1'],df1['key2']]).sum()
代码结果:
Data1 | Data2 | ||
---|---|---|---|
key1 | key2 | ||
a | x | 5 | 15 |
y | 11 | 28 | |
b | x | 9 | 16 |
y | 6 | 17 |
- 除了上述用Series对象作为分组的依据,还可以是:列表、数组、字符串、字典等等。
#列表
df1['Data1'].groupby([1,2,3,2,1]).count()
代码结果:
1 2
2 2
3 1
Name: Data1, dtype: int64
#数组
df1['Data1'].groupby(np.array([2,1,2,1,1])).count()
代码结果:
1 3
2 2
Name: Data1, dtype: int64
#字符串
df1[['Data1','key1']].groupby('key1').count()
代码结果:
Data1 | |
---|---|
key1 | |
a | 3 |
b | 2 |
#字典
df1['Data1'].groupby({0:'y',1:'x',2:'x',3:'y',4:'z'}).count()
代码结果:
x 2
y 2
z 1
Name: Data1, dtype: int64
- ‘麻烦列’被消除
当分组后进行shu数值计算时,不是数值类的列(即麻烦列)会被清除
df1.groupby('key2').mean()
代码结果:
Data1 | Data2 | |
---|---|---|
key2 | ||
x | 7.000000 | 15.5 |
y | 5.666667 | 15.0 |
- 取分组后的一列或某几列
当数据特别巨大时,而我们只需某几列,这时这样的用法是十分省时又方便的。
df1.groupby('key1')['Data1'].max()
代码结果:
key1
a 9
b 9
Name: Data1, dtype: int32
- 传入axis=1横向分组
df1.groupby([1,1,2,1],axis=1).count()
代码结果:
1 | 2 | |
---|---|---|
0 | 3 | 1 |
1 | 3 | 1 |
2 | 3 | 1 |
3 | 3 | 1 |
4 | 3 | 1 |
- 接下来是分组后可运行的简单运算函数表:
谢谢大家的浏览,
希望我的努力能帮助到您,
共勉!