Table of Contents

Lucas Wu

Pandas之Groupby

Pandas中的groupby用于将某些类别进行数据分组,然后对每个组分别执行基础的统计以及复杂的聚合、转换和过滤等操作。

常见的用途有:

基础统计

比如数据电商的水果销售数据,然后进行多种不同分组的统计,第一种按照水果类别进行统计总销售额:

import pandas as pd


data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02',
           '2023-01-03', '2023-01-03', '2023-01-04', '2023-01-04'],
    'Category': ['水果', '蔬菜', '水果', '饮料', '蔬菜', '饮料', '水果', '蔬菜'],
    'Sell': [200, 150, 220, 180, 160, 190, 210, 170]
}

df = pd.DataFrame(data)

grouped = df.groupby('Category')['Sell'].sum()


>>> print(grouped)
Category
水果    630
蔬菜    480
饮料    370
Name: Sell, dtype: int64

第二种为按照两个数据进行分组,这里按照日期和水果类别统计:

grouped = df.groupby(['Date', 'Category'])['Sell'].sum()


>>> print(grouped)
Date        Category
2023-01-01  水果          200
            蔬菜          150
2023-01-02  水果          220
            饮料          180
2023-01-03  蔬菜          160
            饮料          190
2023-01-04  水果          210
            蔬菜          170
Name: Sell, dtype: int64

复杂统计

常见的复杂统计主要几种在聚合(aggregation)、转换(transformation)和过滤(Filtering)。

聚合

聚合用于将分组用于一个或者多个统计函数,比如sum/mean/max/min/count等,调用聚合需要使用agg方法。

grouped = df.groupby(['Category'])['Sell'].agg(['sum', 'max', 'min'])


>>> print(grouped)
          sum  max  min
Category
水果        630  220  200
蔬菜        480  170  150
饮料        370  190  180

转换

对每个组内的数据进行转换,返回一个原数据大小相同的副本结果(即非分组前的大小,但是统计还是按照分组再进行统计),转换需要使用transform方法,该方法接受一个函数或者lambda函数,用于转换每个组内的每个值。

grouped = df.groupby(['Category'])['Sell'].transform(lambda x : x + 1)

>>> print(grouped)
0    201
1    151
2    221
3    181
4    161
5    191
6    211
7    171

过滤

根据某些条件筛选出满足条件的**组(这里是组为单位),**并返回原始数据不包含筛选掉的组的数据,需要使用filter方法进行过滤。

比如下面的方法,按照类别统计了后,其中饮料的组别筛除了,所以返回的数据里面没有饮料的类别。

grouped = df.groupby(['Category']).filter(lambda x : x['Sell'].sum() > 400)


print(grouped)

0  2023-01-01       水果   200
1  2023-01-01       蔬菜   150
2  2023-01-02       水果   220
4  2023-01-03       蔬菜   160
6  2023-01-04       水果   210
7  2023-01-04       蔬菜   170


#原始数据对比
         Date Category  Sell
0  2023-01-01       水果   200
1  2023-01-01       蔬菜   150
2  2023-01-02       水果   220
3  2023-01-02       饮料   180
4  2023-01-03       蔬菜   160
5  2023-01-03       饮料   190
6  2023-01-04       水果   210
7  2023-01-04       蔬菜   170
(完)