约定第一行代码
import numpy as np
import pandas as pd
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()里面分组顺序不同而结果不同
key1 key2
a x 1
y 2
b x 1
y 1
Name: Data1, dtype: int64
根据多列对多列分组
df1.groupby([df1['key1'],df1['key2']]).sum()
- 除了上述用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'].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 |
最后分享一下分组后可以运行的简单运算函数表