pandas数据分组聚合——groupby()、aggregate()、apply()、transform()和filter()方法详解

本文详细介绍了Pandas中的数据分组操作,包括使用groupby()、aggregate()、apply()、transform()和filter()方法。文章讨论了如何按照列名或Series进行分组,以及各种聚合函数的用法,如内置函数和自定义函数,同时阐述了单列与多列聚合的区别。此外,还探讨了transform方法和filter方法在数据处理中的应用。
摘要由CSDN通过智能技术生成

数据分组

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

数据分组原理

在Python中对数据分组利用的是**groupby()**方法:

DataFrame.groupby (by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True,=False, **kwargs)

by :分组字段,接收list、str、mapping或generator,用于确定进行分组的键值。如果传入的是一个函数则对索引进行计算并分组;如果传入的是一个字典或者series则用字典或者series的值作为分组依据;如果传入一个numpy数组则用数据的元素作为分组依据;如果传入的是字符串或者字符串列表则用这些字符串所代表的字段作为分段依据

axis :指定切分方向,默认为0,表示沿着行切分,对列进行操作

level :表示标签所在级别,默认为None

as_index:表示聚合后的聚合标签是否以DataFrame索引形式输出,默认为True;当设置为False时相当于加了reset_index功能

sort :通过sort参数指定是否对输出结果按索引排序,默认为True

group_keys :表示是否显示分组标签的名称,默认为True

squeeze :表示是否在允许的情况下对返回数据进行降维,默认为True

1 分组类型

分组类型

1.1 分组键是列名

分组键是列名时直接将某一列或多列的列名传给groupby()方法,groupby()方法就会按照这一列或多列进行分组。

1.1.1 按照一列进行分组

import pandas as pd
df = pd.read_excel(r"D:\testdata\data.xlsx") 
print(df.head())
print("="*30)
df.info()
   实际价格(元)  运费(元)  数量  实际支付(元)      状态          商品SKU信息       省      市  \
0    218.9    0.0   1    218.9  已付款未发货       金色110cm 1个  内蒙古自治区  呼伦贝尔市   
1    218.9    0.0   1    218.9    交易关闭       金色120cm 1个  内蒙古自治区  呼伦贝尔市   
2    328.9    0.0   1    328.9    交易取消           米白S 1个     山东省    枣庄市   
3    218.9    0.0   1    218.9    交易关闭  黑色M 105-120斤 1个     浙江省    嘉兴市   
4    185.9    0.0   1    185.9  已付款未发货           黑色L 1个     陕西省    咸阳市   

        区       会员等级   优惠信息 是否白付美支付  货款退款金额  运费退款金额               退款完成时间  
0  新巴尔虎右旗  获取会员信息失败!  无优惠信息       否     0.0     0.0                  NaN  
1  新巴尔虎右旗  获取会员信息失败!  无优惠信息       否   218.9     0.0  2020-11-12 09:35:43  
2     薛城区  获取会员信息失败!  无优惠信息       否     0.0     0.0                  NaN  
3     桐乡市  获取会员信息失败!  无优惠信息       否   218.9     0.0  2020-11-12 06:37:25  
4     杨陵区  获取会员信息失败!  无优惠信息       是     0.0     0.0                  NaN  
==============================
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 88 entries, 0 to 87
Data columns (total 15 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   实际价格(元)  88 non-null     float64
 1   运费(元)    88 non-null     float64
 2   数量       88 non-null     int64  
 3   实际支付(元)  88 non-null     float64
 4   状态       88 non-null     object 
 5   商品SKU信息  88 non-null     object 
 6   省        88 non-null     object 
 7   市        88 non-null     object 
 8   区        88 non-null     object 
 9   会员等级     88 non-null     object 
 10  优惠信息     88 non-null     object 
 11  是否白付美支付  88 non-null     object 
 12  货款退款金额   88 non-null     float64
 13  运费退款金额   88 non-null     float64
 14  退款完成时间   41 non-null     object 
dtypes: float64(5), int64(1), object(9)
memory usage: 10.4+ KB
df.groupby("状态") # 以状态列分组
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C9772AE640>
df.groupby("状态").groups   # groups属性返回一个字典,包含所有分组子数据帧与索引值
{'交易关闭': Int64Index([ 1,  3,  5,  6,  7,  8, 13, 14, 15, 16, 17, 18, 21, 22, 23, 28, 29,
             30, 33, 35, 37, 38, 39, 43, 45, 46, 49, 50, 51, 54, 56, 59, 65, 67,
             70, 75, 77, 80, 81, 82, 84],
            dtype='int64'),
 '交易取消': Int64Index([ 2, 11, 24, 31, 36, 41, 44, 47, 48, 52, 55, 60, 61, 62, 64, 66, 69,
             73, 79, 83, 85, 86],
            dtype='int64'),
 '已付款未发货': Int64Index([ 0,  4,  9, 10, 12, 19, 20, 25, 26, 27, 32, 34, 40, 42, 53, 57, 58,
             63, 68, 71, 72, 74, 76, 78],
            dtype='int64'),
 '已发货': Int64Index([87], dtype='int64')}
print(df.groupby("状态").size()) # 查看各状态的元素个数
状态
交易关闭      41
交易取消      22
已付款未发货    24
已发货        1
dtype: int64

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

df.groupby("状态").count() 
实际价格(元) 运费(元) 数量 实际支付(元) 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
状态
交易关闭 41 41 41 41 41 41 41 41 41 41 41 41 41 41
交易取消 22 22 22 22 22 22 22 22 22 22 22 22 22 0
已付款未发货 24 24 24 24 24 24 24 24 24 24 24 24 24 0
已发货 1 1 1 1 1 1 1 1 1 1 1 1 1 0

通过调用get_group( )函数可以返回一个按照分组得到的DataFrame对象,如果想让这个DataFrame对象的索引重新定义可以通过set_index()方法

df.groupby("状态").get_group("已发货").set_index("省")  #获取状态分组中的已发货信息并以省作为新索引
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
上海市 328.9 0.0 1 328.9 已发货 米白S 1个 上海市 青浦区 获取会员信息失败! 无优惠信息 0.0 0.0 NaN

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

df.groupby("状态").sum()
实际价格(元) 运费(元) 数量 实际支付(元) 货款退款金额 运费退款金额
状态
交易关闭 8870.3 0.0 41 8870.3 8870.3 0.0
交易取消 14767.7 0.0 22 14767.7 0.0 0.0
已付款未发货 4910.6 0.0 24 4910.6 0.0 0.0
已发货 328.9 0.0 1 328.9 0.0 0.0

我们把这种对分组后的数据进行汇总运算的操作称为聚合,使用的函数称为聚合函数

1.1.2 按照多列进行分组

上面分组键是某一列,即按照一列进行分组,也可以按照多列进行分组,只要**

  • 68
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值