Pandas之groupby分组


释义

groupby用来分组,调用groupby 之后返回pandas.core.groupby.generic.DataFrameGroupBy,其实就是由一个个格式为(key, 分组后的dataframe)的元组,组成的列表:

[(key1, dataframe1), (key2, dataframe2), ...]

案例

  • 初始化数据,此时这个班级有2个同名的人都叫Jack
df = pd.DataFrame({'stu_name': ['Tom', 'Tony', 'Jack', 'Jack'], 'stu_age': [16, 16, 15, 21]})
print(df)
  stu_name  stu_age
0      Tom       16
1     Tony       16
2     Jack       15
3     Jack       21

  • 根据stu_name 进行分组,根据上面的释义,则可以遍历列表中的每个元组
groups = df.groupby(['stu_name'])
for v in groups:
    print(v)
('Jack',   stu_name  stu_age
2     Jack       15
3     Jack       21)
('Tom',   stu_name  stu_age
0      Tom       16)
('Tony',   stu_name  stu_age
1     Tony       16)

显而易见,每个元素v中,v[0]是groupby的列名,v[1]就是该分组下的dataframe

groupby之后的聚合操作

groupby之后更常见的是使用各种聚合函数,如

  • min:最小值
  • max:最大值
  • sum:总和
  • mean:平均值
  • median:中位数
  • count:计数
  • var:方差
  • std:标准差

案例

  • 初始化数据
df = pd.DataFrame({'stu_name': ['Tom', 'Tony', 'Jack', 'Jack'], 'stu_age': [16, 16, 15, 21], 'stu_score': [99, 1, 1, 0]})
  stu_name  stu_age  stu_score
0      Tom       16         99
1     Tony       16          1
2     Jack       15          1
3     Jack       21          0
  • 以名字分组,并对分组后的年龄、成绩求和(例子不具备显示意义,仅做演示)
sum_df = df.groupby(['stu_name']).sum()
print(sum_df)
          stu_age  stu_score
stu_name                    
Jack           36          1
Tom            16         99
Tony           16          1

groupby之后直接调用聚合函数,会对所有的列进行聚合操作,但有些时候需要在分组后对多个列进行不同的聚合操作,比如groupby之后,年龄求和,分数求平均值,这时候就需要使用agg函数

groupby之后使用agg函数

  • 沿用上面的原始数据,以名字分组,分组后年龄求和,成绩求平均值
agg_df = df.groupby(['stu_name']).agg({'stu_age': 'sum', 'stu_score': 'mean'})
print(agg_df)
          stu_age  stu_score
stu_name                    
Jack           36        0.5
Tom            16       99.0
Tony           16        1.0

可以看出如果groupby后要对分组内所有的列都进行一样的操作,那直接调用相关的聚合函数即可,如果是分组后不同的列进行不同的聚合操作,则可以直接采用agg函数。



上一篇:Pandas (五) 数据分组


下一篇:学生课程分数的Spark SQL分析