如何在Pandas中批量设置df1列取first、df2列取join的agg聚合?
动态指定分组聚合规则的实现方案
问题背景
现有两个DataFrame:
import pandas as pd df1 = pd.DataFrame({'List' : ['P111', 'P999', 'P111;P999;P777', 'P555', 'P666;P111;P333'], 'Color' : ['red', 'red', 'blue','yellow', 'red']}) df2 = pd.DataFrame({'Cod' : ['P111', 'P222', 'P333', 'P444', 'P555', 'P666', 'P777'], 'Animal' : ['DOG', 'CAT', 'BUG','SNAKE,DOG', 'CAT,BUG', 'DOG', 'SNAKE'], 'Letter' : ['A,F', 'C', 'S,M', 'F,L', 'C,A','M,C', 'Z,L']})
当前采用手动指定列的方式执行分组聚合:
... .groupby('index') .agg(List=('List','first'), Sequence=('Sequence','first'), Animal=('Animal','|'.join), Letter=('Letter','|'.join)) ...
但由于df1、df2的列数量不固定,且部分列名包含空格,无法手动逐个指定聚合方式,需要实现自动对df1所有列应用first聚合,对df2所有列应用'|'.join聚合的逻辑。
解决方案
通过字典推导式分别为两个DataFrame生成对应聚合规则,再合并规则字典后传入agg()方法即可实现动态指定:
# 为df1生成聚合规则:所有列使用'first' agg_rules_df1 = {col: 'first' for col in df1.columns} # 为df2生成聚合规则:所有列使用'|'.join agg_rules_df2 = {col: '|'.join for col in df2.columns} # 合并两个规则字典 total_agg_rules = {**agg_rules_df1, **agg_rules_df2} # 执行分组聚合(假设已完成df1与df2的合并,得到包含index列的merged_df) final_result = merged_df.groupby('index').agg(total_agg_rules)
说明
- 字典推导式会自动遍历DataFrame的所有列,不管列名是否包含空格、列数量多少,都能生成对应的聚合规则
- 合并字典时,如果df1和df2存在同名列,df2的规则会覆盖df1的(可根据实际需求调整合并顺序)
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

