合并DataFrame字典并添加source列,去重及原字典还原问询
多DataFrame字典合并与还原方案
问题描述
现有包含多个DataFrame的字典(规模较大):
import pandas as pd data = { 'src1': pd.DataFrame({ 'x1': ['SNN', 'YH', 'CDD', 'ONT', 'ONT'], 'x2': ['AAGH', 'KSD', 'CHH', '002274', '301002'] }), 'src2': pd.DataFrame({ 'x1': ['HA', 'TRA', 'GHJ', 'AH', 'ONT'], 'x2': ['NNG', 'ASGH', 'CTT', 'AGF', '002274'] }), 'src3': pd.DataFrame({ 'x1': ['AX', 'TG', 'ONT', 'XR', 'ONT'], 'x2': ['GG61A', 'X3361', '301002', '07512', '002274'] }) }
需求:
- 将所有DataFrame合并为单个DataFrame,新增
source列标注数据所属的字典键 - 合并重复行(如
ONT 002274这类在多个src中出现的行),source列显示为所有所属键的列表(如['src1','src2','src3']) - 验证该格式是否可还原原字典,并寻找更优还原方法
之前尝试的concat代码仅完成拼接,未实现去重合并:
keys = list(df_dict.keys()) df = pd.concat([data[key].assign(Key=key) for key in keys])
解决方案
通过拼接+分组聚合实现需求:
# 1. 拼接所有DataFrame并添加source列 combined = pd.concat([df.assign(source=key) for key, df in data.items()]) # 2. 按x1、x2分组,将source列聚合为去重后的列表 merged_df = combined.groupby(['x1', 'x2'], as_index=False).agg( {'source': lambda x: sorted(list(set(x)))} # sorted保证列表顺序一致,可选 )
执行后得到的merged_df核心结构示例:
| x1 | x2 | source |
|---|---|---|
| ONT | 002274 | ['src1', 'src2', 'src3'] |
| ONT | 301002 | ['src1', 'src3'] |
| SNN | AAGH | ['src1'] |
关于原字典的还原说明
1. 格式可行性
该格式完全可以还原原字典,但需注意:合并时已对重复行去重,还原后的DataFrame会丢失原字典中单个src内的重复行(如src1中重复的ONT 301002)。如果需要保留原重复行,合并时不要聚合,直接保留所有行(source列为单个键)即可。
2. 更优还原方法
无需手动遍历,利用explode+groupby+字典推导式可高效还原:
# 将source列表拆分为多行,每行对应一个来源 expanded = merged_df.explode('source') # 按source分组,生成原字典结构 restored_data = { key: group.drop('source', axis=1).reset_index(drop=True) for key, group in expanded.groupby('source') }
该方法比手动遍历更高效,尤其适合大规模数据场景。
内容的提问来源于stack exchange,提问作者anarchy
相关产品推荐
相关产品推荐

