如何用Pandas GroupBy按ID聚合C1、C2列的值为列表?
Pandas按ID分组合并多列值为去重列表的最优方法
原始数据构造
先还原问题中的DataFrame:
import pandas as pd df = pd.DataFrame({ 'ID': [1, 1, 2, 1], 'C1': ['a', 'b', 'p', 'r'], 'C2': ['b', 'e', 'a', 'a'], 'C3': ['r', 'g', 'z', 'n'], 'C4': ['q', 'h', 'p', 'm'] })
最优实现方法
根据需求(合并后去重并保留首次出现顺序),推荐两种高效方案:
方案1:堆叠列后聚合(大数据集首选)
通过melt将C1、C2列转为长格式,再按ID分组,用dict.fromkeys实现去重并保留顺序,这种方式依赖Pandas向量化操作,处理大数据集时效率更高:
# 提取目标列转长格式,分组后去重并转为列表 out = df[['ID', 'C1', 'C2']].melt(id_vars='ID')['value'].groupby(df['ID']).agg(lambda x: list(dict.fromkeys(x))).reset_index(name='l')
方案2:分组后直接合并去重(小数据集更直观)
直接按ID分组,合并C1、C2的列表后去重,代码逻辑清晰,小数据场景下使用更便捷:
# 分组后合并C1、C2列表,再去重保留顺序 out = df.groupby('ID').agg( l=lambda x: list(dict.fromkeys(x['C1'].tolist() + x['C2'].tolist())) ).reset_index()
最终输出
两种方案都能得到与需求一致的结果:
ID l 0 1 [a, b, r, e] 1 2 [p, a]
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

