You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于动态筛选列对DataFrame执行GroupBy与聚合操作

动态实现DataFrame分组聚合的修正方案

场景说明

现有结构如下的DataFrame:

dfMMS_BBMS_pv.columns
# 输出列名:
['area_type', 'area_name', 'area_code', 'date', 'A_BBMS',
   'A_MMS', 'Others_BBMS', 'Others_MMS', 'B_BBMS',
   'C_BBMS', 'C_MMS', 'T_BBMS', 'V_BBMS',
   'D_BBMS', 'D_MMS']

静态聚合的实现逻辑可行:

dfMMS_BBMS_pv = dfMMS_BBMS_pv.groupby(['area_type', 'area_name', 'area_code']).\
agg({'date': lambda x: list(x), 'A_MMS': lambda x: list(round(x,2)) })

现在需要动态聚合所有名称含BBMS或MMS的列,同时必须保留date列的聚合规则,但原动态代码因语法错误无法运行。

错误原因

原代码尝试直接在agg的字典参数中嵌入列表推导式,这违反了Python字典的语法规则——字典键值对不能通过列表推导式直接声明,需先单独构建动态列的聚合规则字典,再与date列的规则合并。

修正后的代码

# 1. 获取所有含BBMS/MMS的目标列
Interested_Cols = dfMMS_BBMS_pv.filter(regex='BBMS|MMS').columns

# 2. 构建动态聚合规则字典:将目标列转成保留两位小数的列表
dynamic_agg = {col: lambda x: x.round(2).tolist() for col in Interested_Cols}

# 3. 加入date列的聚合规则
dynamic_agg['date'] = lambda x: x.tolist()

# 4. 执行分组聚合
dfMMS_BBMS_pv = dfMMS_BBMS_pv.groupby(['area_type', 'area_name', 'area_code']).agg(dynamic_agg)

补充优化说明

  • 使用x.tolist()替代list(x)是Pandas官方更推荐的Series转列表方式
  • x.round(2).tolist()利用了Pandas向量化操作,比遍历元素逐个round更高效

内容的提问来源于stack exchange,提问作者Moh-Spark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:15:47