如何基于动态筛选列对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
相关产品推荐
相关产品推荐

