如何在Pandas中按MainID合并多行SecID为冒号分隔列?
最优实现方案
对于这种按主ID合并次级ID的场景,用pandas的groupby+agg组合是最高效的解决方案,它利用pandas的向量化操作,性能远优于循环处理。
代码实现
import pandas as pd # 构造示例数据 data={'MainID':['NHFPL0580','NHFPL0580','NHFPL0582','NHFPL0582'],'SecID':['G12345','G67890','G11223','G34455'], 'Other':['A','A','B','B']} df=pd.DataFrame(data) # 分组聚合处理 result_df = df.groupby('MainID').agg( SecID=('SecID', ':'.join), Other=('Other', 'first') # 同一MainID下该列值一致,取第一个即可 ).reset_index() print(result_df)
输出结果
MainID SecID Other 0 NHFPL0580 G12345:G67890 A 1 NHFPL0582 G11223:G34455 B
补充说明
agg方法可以同时为不同列指定聚合逻辑,代码清晰直观;- 对于
Other这类同一分组下值完全相同的列,用first()/last()/max()等任意聚合方法都能得到正确结果; - 如果存在多个类似
Other的列,可以通过字典批量配置聚合规则,简化代码:# 多列场景的简化写法 agg_dict = {col: 'first' for col in df.columns if col not in ['MainID', 'SecID']} agg_dict['SecID'] = ':'.join result_df = df.groupby('MainID').agg(agg_dict).reset_index()
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

