pandas系列之数据分组(一)按照列名分组

2,807 阅读3分钟

数据分组就是根据一个或多个键(可以是函数、数组或者df列名)将数据分为若干组,然后对分组后的数据分别进行汇总计算,并将汇总计算后的结果进行合并。被用作汇总计算的函数称为聚合函数。

本文用到的表格内容如下:

image.png 先来看一下数据情形

import pandas as pd
​
​
life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df)

result:

      分类  编号    名称
0     水果   0    苹果
1     水果   1    橙子
2   生活用品   2    牙刷
3   生活用品   3    冰箱
4   生活用品   4   电视机
5     食物   0    苹果
6     食物   1    橙子
7     家电   3    冰箱
8     家电   4   电视机
9     大件   3    冰箱
10    大件   4   电视机
11    大件   5    茶几
12  生活用品   7  暖手宝宝
13  小说   8   红楼梦

数据分组具体的过程如下所示

133.png

1 按照一列进行分组

life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df.groupby("分类"))

result:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001894A41C708>

从上面的结果可以看出,如果只是传入列名,分组后的结果是一个DataFrameGroupBy对象。这个对象包含着分组以后的若干组数据,但是没有直接显示出来,需要对这些分组数据进行汇总计算以后才会显示出来

life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df.groupby("分类").count())

result:

  编号  名称
​
分类          
大件     3   3
家电     2   2
小说     1   1
水果     2   2
生活用品   4   4
食物     2   2

上面的代码是根据物品分类对所有数据进行了分组,然后对分组以后的数据分别进行计数运算,最后进行合并。

由于对分组后的数据进行了计数运算,因此每一列都会有一个结果。但是如果对分组后的结果做一些数值运算,这个时候只有数据类型是数值(int、float)的列才会参与运算

import pandas as pd
​
life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df.groupby("分类").sum())

result:

      编号
​
分类      
大件    12
家电     7
小说     8
水果     1
生活用品  16
食物     1

我们把这种对分组后的数据进行汇总运算的操作称为聚合,使用的函数称为聚合函数。比如前面系列文章提高的非空值计数、sum求和、最大值最小值、均值、中位数、众数、方差、标准差和分位数这些。都属于聚合函数。

2 按照多列进行分组

多列分组和单列分组差不多,只要将对个列名以列表的形式传递给groupby()即可。

life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df.groupby(["分类", "名称"]).count())

result:

       编号
​
分类   名称      
大件   冰箱     1
     电视机    1
     茶几     1
家电   冰箱     1
     电视机    1
小说   红楼梦    1
水果   橙子     1
     苹果     1
生活用品 冰箱     1
     暖手宝宝   1
     牙刷     1
     电视机    1
食物   橙子     1
     苹果     1
life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df.groupby(["分类", "名称"]).sum())

result:

       编号
​
分类   名称      
大件   冰箱     3
     电视机    4
     茶几     5
家电   冰箱     3
     电视机    4
小说   红楼梦    8
水果   橙子     1
     苹果     0
生活用品 冰箱     3
     暖手宝宝   7
     牙刷     2
     电视机    4
食物   橙子     1
     苹果     0

3 分组和聚合采用不同的列进行

上述1和2这2种方式,无论是一列还是多列,只要直接在分组后的数据上进行汇总计算,就是对所有可计算的列进行计算。有的时候我们不需要对所有列进行计算,这个时候可以指定要计算的列(无论是单列还是多列)

life_df = pd.read_excel(r'C:\Users\admin\Desktop\生活用品表.xlsx')
print(life_df.groupby("分类")["名称"].count())

result:

分类
大件      3
家电      2
小说      1
水果      2
生活用品    4
食物      2
Name: 名称, dtype: int64

这里就是按照物品分类进行分组,再按照物品名称进行汇总统计