Python/Pandas分组聚合时批量为多列配置相同聚合规则的方法
Pandas批量配置分组聚合规则解决方案
完全支持批量为指定列子集应用相同聚合操作,你可以通过字段筛选+字典推导式生成聚合规则,不需要手动逐个填写30个Demand字段,同时针对1500万行的大表场景还可以做性能优化,具体实现如下:
实现逻辑
- 第一步:筛选出所有以
Demand结尾的需求类字段 - 第二步:构造聚合规则字典,单独配置Date列的间隔计算逻辑,批量给所有Demand字段配置求和规则
- 第三步:将聚合规则字典直接传入
agg()方法完成分组计算
优化说明
针对千万级大表,不要用lambda x: x.sum()这种自定义求和逻辑,直接传入字符串'sum'调用pandas内置的C优化实现,运算速度会快数倍。如果内存占用过高,可以提前只加载参与计算的列,减少不必要的内存开销。
完整代码示例
import pandas as pd import datetime as dt # 日期格式转换 df['Date'] = pd.to_datetime(df['Date']) # 批量筛选所有Demand结尾的需求列 demand_cols = [col for col in df.columns if col.endswith('Demand')] # 构造聚合规则字典 agg_dict = { # 计算最近购买日到固定截止日2021-01-01的间隔天数 'Date': lambda x: (dt.date(2021, 1, 1) - x.max()).days } # 批量为所有Demand列添加求和规则 agg_dict.update({col: 'sum' for col in demand_cols}) # 执行分组聚合 newdf = df.groupby('CustomerID').agg(agg_dict) # 可选:重命名Date列更符合语义 newdf = newdf.rename(columns={'Date': 'DaysSinceLastPurchase'})
如果你的需求是用数据内的最大日期作为截止基准,而非固定的2021-01-01,替换agg_dict构造逻辑即可:
cutoffDate = df['Date'].max() + dt.timedelta(days = 1) agg_dict = { 'Date': lambda x: (cutoffDate - x.max()).days }
内容的提问来源于stack exchange,提问作者Parseval
相关产品推荐
相关产品推荐

