约定
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
谢谢大家的浏览,
希望我的努力能帮助到您,
共勉!