如何在DataFrame中合并重复信息并将ID聚合为列表
合并同日期同事件记录并将ID聚合为列表
需求说明
将同一天且事件描述相同的记录合并为一条,把所有参与者ID聚合为列表;事件描述不同则保留为独立行。后续会持续新增事件数据并合并到现有表格。
现有问题
当前代码仅按Date分组,且用sum聚合ID导致ID被拼接成字符串,不符合列表形式的需求。
解决方案
关键修改点
- 分组键改为
['Date', 'Description'],确保同日期+同描述的记录才会合并 - ID的聚合方式替换为
list,直接生成列表格式的ID集合 - 可选:用
reset_index()将分组索引转为普通列,让表格结构更直观
修改后的完整代码
import pandas as pd # 原始数据 x1 = ['2023-06-20','2023-06-20','2023-06-20','2023-06-20','2023-06-20', '2023-06-23','2023-06-23','2023-06-23','2023-06-23','2023-06-23'] x2 = ['1','2','3','4','5','1','2','3','4','5'] x3 = ['test1','test1','test1','test1','test1','test2','test2','test2','test2','test2'] df = pd.DataFrame({'Date': x1, 'ID': x2, 'Description': x3 }) # 定义聚合规则:Date和Description取第一个值,ID转为列表 agg_functions = {'Date': 'first', 'ID': list, 'Description': 'first'} # 按日期和事件描述分组聚合 df_new = df.groupby(['Date', 'Description']).aggregate(agg_functions).reset_index(drop=True) print(df_new)
运行结果
Date ID Description 0 2023-06-20 ['1', '2', '3', '4', '5'] test1 1 2023-06-23 ['1', '2', '3', '4', '5'] test2
后续新增数据的处理方法
当有新数据时,可按以下步骤操作:
- 将新数据整理为同结构的DataFrame(例:命名为
new_df) - 合并现有结果与新数据:
combined_df = pd.concat([df_new, new_df], ignore_index=True) - 重新执行分组聚合,确保新数据被正确合并:
# 重新聚合,避免重复分组导致的错误 final_df = combined_df.groupby(['Date', 'Description']).aggregate({ 'ID': lambda x: list(pd.unique([item for sublist in x for item in sublist])), 'Date': 'first', 'Description': 'first' }).reset_index(drop=True)
注:用pd.unique和嵌套列表推导式是为了避免新增数据中重复ID被多次加入列表;若需要保留重复ID,直接用lambda x: [item for sublist in x for item in sublist]即可。
内容的提问来源于stack exchange,提问作者zzzzzero
相关产品推荐
相关产品推荐

