python中分组函数groupby和分组运算函数agg的使用
今天来介绍pandas中一个很有用的函数groupby,其实和hive中的groupby的效果是一样的,区别在于两种语言的写法问题。groupby在python中的分组统计中很有用~
groupby:
首先创建数据:
import pandas as pd import numpy as np df = 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]}) df out[2]: a b c 0 a 2 100 1 b 7 87 2 a 1 96 3 c 3 130 4 a 3 105 5 c 2 87 6 b 4 96
pandas中groupby的基本操作:
1、按a列进行分组,求b、c两列的均值:
df.groupby('a').mean() out[6]: b c a a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000
当然也可以按照多列进行分组,获取其他列的均值:
df.groupby(['a','b']).mean() out[7]: c a b a 1 96 2 100 3 105 b 4 96 7 87 c 2 87 3 130 8 155
2、分组后,选择列进行计算:
data=df.groupby('a') data['b'].std() out[11]: a a 1.00000 b 2.12132 c 3.21455 name: b, dtype: float64 #选择b、c两列 data['b','c'].mean() out[12]: b c a a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000
3、按a进行分组后,可以对不同的列采用不同的聚合方法(ps:这一点就和hive很相像了)
data.agg({'b':'mean','c':'sum'}) #b列均值,c列汇总 out[14]: c b a a 301 2.000000 b 183 5.500000 c 372 4.333333
4、如果按照a进行分组后,对多列采用相同的聚合方法,我们可以借助apply函数:
df.groupby('a').apply(np.mean) out[25]: b c a a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000
5、将某列数据按数据值分成不同范围段进行分组运算
创建数据集:
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_foo 0 64 female 14 1 67 female 14 2 20 female 12 3 23 male 17 4 23 female 15
目标:将age字段分成三组,有如下两种方法实现:
#第一种方法: 1、bins=4 pd.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_foo age (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 male age (19.0, 40.0] 22 28 (40.0, 65.0] 18 24 (65.0, inf] 3 5
agg:
1、使用groupby按照某列(a)进行分组后,需要对另外一列采用不同的聚合方法:
df.groupby('a')['b'].agg({'mean':np.mean, 'std': np.std}) out[16]: std mean a a 1.00000 2.000000 b 2.12132 5.500000 c 3.21455 4.333333
2、按照某列进行分组后,对不同的列采用不同的聚合方法:
df.groupby('a').agg({'b':[np.mean,'sum'],'c':['count',np.std]}) #[]中对应的是两种方法 out[17]: c b count std mean sum a a 3 4.509250 2.000000 6 b 2 6.363961 5.500000 11 c 3 34.394767 4.333333 13
transform:
前面两种方法得到的结果是以a列值为索引的结果,如果使用没有进行groupby分组的index的话,该怎么操作呢?此时就要用到transform函数了。transform(func, args, *kwargs) 方法简化了这个过程,: func 参数应用到所有分组,然后把结果放置到原数组的 index 上:
df out[31]: a b c 0 a 2 100 1 b 7 87 2 a 1 96 3 c 3 130 4 a 3 105 5 c 2 87 6 b 4 96 7 c 8 155 df.groupby('a')['b','c'].transform('count') #注:count函数在计算时,不计算nan值 out[32]: b c 0 3 3 1 2 2 2 3 3 3 3 3 4 3 3 5 3 3 6 2 2 7 3 3
从中可以看出:按a列进行分组,对b、c两列进行计数时,b为a的索引有[0,2,4],所以结果列的中[0,2,4]索引的值都为3,相当于广播了。对于c列,同理。
到此这篇关于python中分组函数groupby和分组运算函数agg的使用的文章就介绍到这了,更多相关python 分组函数groupby和分组运算函数agg内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: 上海财经大学实力怎么样:为什么说普通985嘲笑上财?
下一篇: 做好这3点,再来谈人工智能创业与赚钱
推荐阅读
-
OpenCV中的新函数connectedComponentsWithStats使用(python和c++实例)
-
Python中的sync和wait函数的使用
-
pandas数据分组groupby()和统计函数agg()的使用
-
简单介绍Python中的filter和lambda函数的使用
-
Python DataFrame.groupby()聚合函数,分组级运算
-
python中分组函数groupby和分组运算函数agg的使用
-
详解Python中的分组函数groupby和itertools)
-
Python中函数的多种格式和使用实例及小技巧
-
php怎么输出以下使用聚集函数和分组数据查询出来的MySQL查询结果?
-
OpenCV中的新函数connectedComponentsWithStats使用(python和c++实例)