Pandas详解十六之groupby分组后分开运算

约定

import pandas as pd
import numpy as np

groupby分组后分开运算

Groupby对象支持迭代,当我们分组后想保存分组结果而不想运算,或者分别对每组进行不同的运算,这时是十分有用的。

1 创建

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)
   Data1  Data2 key1 key2
0      0     18    a    x
1      9     11    a    y
2      0     13    b    y
3      9     19    b    x
4      5     13    a    y

2 分析分组的结果

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

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

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

print('\n',a[1])
print('a[1]的类型:',type(a[1]))
('a',    Data1  Data2 key1 key2
0      0     18    a    x
1      9     11    a    y
4      5     13    a    y)
a的类型: <class 'tuple'>

 a
a[0]的类型: <class 'str'>

    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'>

3 对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

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

下例用列: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)

5 迭代

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

6 将分组结果变成字典

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

7 根据列的数据类型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 

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

  • 13
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值