You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并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']
    })
}

需求:

  1. 将所有DataFrame合并为单个DataFrame,新增source列标注数据所属的字典键
  2. 合并重复行(如ONT 002274这类在多个src中出现的行),source列显示为所有所属键的列表(如['src1','src2','src3'])
  3. 验证该格式是否可还原原字典,并寻找更优还原方法

之前尝试的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核心结构示例:

x1x2source
ONT002274['src1', 'src2', 'src3']
ONT301002['src1', 'src3']
SNNAAGH['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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:35:20