Pandas详解十五之利用GroupBy技术进行分组

约定:
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
  • 接下来是分组后可运行的简单运算函数表:
    这里写图片描述

谢谢大家的浏览,
希望我的努力能帮助到您,
共勉!

猜你喜欢

转载自blog.csdn.net/weixin_38168620/article/details/80100201
今日推荐