约定第一行代码

import numpy as np
import pandas as pd

groupby分组后分开运算

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')})
print(df1)

代码结果

Data1Data2key1key2
0018ax
1911ay
2013by
3919bx
4513ay

分析分拆结果

下例用列:key1来对df1进行分组,由上面key1只有:a、b,故分为两组。下面解包时是以tuple(key1,分组结果)返回的

a,b= df1.groupby('key1')
print(a)
print('a的类型:',type(a))

#代码结果
('a',    Data1  Data2 key1 key2
0      0     18    a    x
1      9     11    a    y
4      5     13    a    y)
a的类型: <class 'tuple'>

print('\n',a[0])
print('a[0]的类型:',type(a[0]))

#代码结果
 a
a[0]的类型: <class 'str'>

print('\n',a[1])
print('a[1]的类型:',type(a[1]))

#代码结果
    Data1  Data2 key1 key2
0      0     18    a    x
1      9     11    a    y
4      5     13    a    y
a[1]的类型: <class 'pandas.core.frame.DataFrame'>

对groupby结果进行迭代

for name,group in df1.groupby('key1'):
    print('*'*13+name+'*'*13+'\n',group)
    print()

#代码结果
*************a*************
    Data1  Data2 key1 key2
0      0     18    a    x
1      9     11    a    y
4      5     13    a    y

*************b*************
    Data1  Data2 key1 key2
2      0     13    b    y
3      9     19    b    x

分析用多个列进行分组的结果

下例用列:key1、key2来对df1进行分组,故分组结果为4个。下面解包时是以tuple((key1,key2),分组结果)返回的

gr1=df1.groupby(['key1','key2'])
print('长度:',len(gr1),'\n')
ax,ay,bx,by=gr1
print('ax :\n',ax)

#代码结果
长度: 4 

ax :
 (('a', 'x'),    Data1  Data2 key1 key2
0      0     18    a    x)

迭代

for (key1,key2),group in df1.groupby(['key1','key2']):
    print('*'*13+key1+key2+'*'*13+'\n',group)
    print()

#代码结果
*************ax*************
    Data1  Data2 key1 key2
0      0     18    a    x

*************ay*************
    Data1  Data2 key1 key2
1      9     11    a    y
4      5     13    a    y

*************bx*************
    Data1  Data2 key1 key2
3      9     19    b    x

*************by*************
    Data1  Data2 key1 key2
2      0     13    b    y

将分组结果变成字典

dict1=dict(list(df1.groupby('key1')))
print(dict1['b'])

#代码结果
   Data1  Data2 key1 key2
2      0     13    b    y
3      9     19    b    x
dict2=dict(list(df1.groupby(['key1','key2'])))
print(dict2[('a','y')])

#代码结果
   Data1  Data2 key1 key2
1      9     11    a    y
4      5     13    a    y

根据列数据类型dtype对列进行分组

print('df1 各列的数据类型\n',df1.dtypes,'\n')
for key,group in dict(list(df1.groupby(df1.dtypes,axis=1))).items():
    print("*"*5,key,"*"*5)
    print(group,'\n')

#代码结果
df1 各列的数据类型
 Data1     int32
Data2     int32
key1     object
key2     object
dtype: object 

***** int32 *****
   Data1  Data2
0      0     18
1      9     11
2      0     13
3      9     19
4      5     13 

***** object *****
  key1 key2
0    a    x
1    a    y
2    b    y
3    b    x
4    a    y 

世界因代码而改变 Peace Out
世界因代码而改变 Peace Out
最后修改:2020 年 10 月 07 日 03 : 20 PM
如果觉得我的文章对你有用,请随意赞赏