今天来介绍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]... #第二种<i style="color:transparent">本文来源gaodai$ma#com搞$代*码6网</i>方法 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