这篇文章主要介绍“怎么使用python中分组函数groupby和分组运算函数agg”,在日常操作中,相信很多人在怎么使用python中分组函数groupby和分组运算函数agg问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用python中分组函数groupby和分组运算函数agg”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
groupby:
首先创建数据:
import pandas as pdimport numpy as npdf = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'], 'B': [2, 7, 1, 3, 3, 2, 4, 8], 'C': [100, 87, 96, 130, 105, 87, 96, 155]})dfOut[2]: A B C0 a 2 1001 b 7 872 a 1 963 c 3 1304 a 3 1055 c 2 876 b 4 96
pandas中groupby的基本操作:
按A列进行分组,求B、C两列的均值:
df.groupby('A').mean()Out[6]: B CA a 2.000000 100.333333b 5.500000 91.500000c 4.333333 124.000000
当然也可以按照多列进行分组,获取其他列的均值:
df.groupby(['A','B']).mean()Out[7]: CA B a 1 96 2 100 3 105b 4 96 7 87c 2 87 3 130 8 155
分组后,选择列进行计算:
data=df.groupby('A')data['B'].std()Out[11]: Aa 1.00000b 2.12132c 3.21455Name: B, dtype: float64 #选择B、C两列data['B','C'].mean()Out[12]: B CA a 2.000000 100.333333b 5.500000 91.500000c 4.333333 124.000000
按A进行分组后,可以对不同的列采用不同的聚合方法(ps:这一点就和hive很相像了)
data.agg({'B':'mean','C':'sum'}) #B列均值,C列汇总Out[14]: C BA a 301 2.000000b 183 5.500000c 372 4.333333
如果按照A进行分组后,对多列采用相同的聚合方法,我们可以借助apply函数:
df.groupby('A').apply(np.mean)Out[25]: B CA a 2.000000 100.333333b 5.500000 91.500000c 4.333333 124.000000
将某列数据按数据值分成不同范围段进行分组运算
创建数据集:
np.random.seed(0)df = pd.DataFrame({'Age': np.random.randint(20, 70, 100), 'Sex': np.random.choice(['Male', 'Female'], 100), 'number_of_foo': np.random.randint(1, 20, 100)})Out[38]: Age Sex number_of_foo0 64 Female 141 67 Female 142 20 Female 123 23 Male 174 23 Female 15
目标:将age字段分成三组,有如下两种方法实现:
#第一种方法:1、bins=4pd.cut(df['Age'], bins=4)0 (56.75, 69.0]1 (56.75, 69.0]2 (19.951, 32.25]3 (19.951, 32.25]4 (19.951, 32.25]... #第二种方法2、bins=[19, 40, 65, np.inf]pd.cut(df['Age'], bins=[19,40,65,np.inf])Out[40]: 0 (40.0, 65.0]1 (65.0, inf]2 (19.0, 40.0]3 (19.0, 40.0]4 (19.0, 40.0] #分组范围结果如下:age_groups = pd.cut(df['Age'], bins=[19,40,65,np.inf])df.groupby(age_groups).mean()Out[43]: Age number_of_fooAge (19.0, 40.0] 29.840000 9.880000(40.0, 65.0] 52.833333 9.452381(65.0, inf] 67.375000 9.250000 #按‘Age'分组范围和性别(sex)进行制作交叉表 pd.crosstab(age_groups, df['Sex'])Out[44]: Sex Female MaleAge (19.0, 40.0] 22 28(40.0, 65.0] 18 24(65.0, inf] 3 5
agg:
使用groupby按照某列(A)进行分组后,需要对另外一列采用不同的聚合方法:
df.groupby('A')['B'].agg({'mean':np.mean, 'std': np.std}) Out[16]: std meanA a 1.00000 2.000000b 2.12132 5.500000c 3.21455 4.333333
按照某列进行分组后,对不同的列采用不同的聚合方法:
df.groupby('A').agg({'B':[np.mean,'sum'],'C':['count',np.std]}) #[]中对应的是两种方法 Out[17]: C B count std mean sumA a 3 4.509250 2.000000 6b 2 6.363961 5.500000 11c 3 34.394767 4.333333 13
transform:
前面两种方法得到的结果是以A列值为索引的结果,如果使用没有进行groupby分组的index的话,该怎么操作呢?此时就要用到transform函数了。transform(func, args, *kwargs) 方法简化了这个过程,: func 参数应用到所有分组,然后把结果放置到原数组的 index 上:
dfOut[31]: A B C0 a 2 1001 b 7 872 a 1 963 c 3 1304 a 3 1055 c 2 876 b 4 967 c 8 155 df.groupby('A')['B','C'].transform('count') #注:count函数在计算时,不计算nan值Out[32]: B C0 3 31 2 22 3 33 3 34 3 35 3 36 2 27 3 3
从中可以看出:按A列进行分组,对B、C两列进行计数时,B为a的索引有[0,2,4],所以结果列的中[0,2,4]索引的值都为3,相当于广播了。对于C列,同理。
到此,关于“怎么使用python中分组函数groupby和分组运算函数agg”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!