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

如何在Merge后恢复经多列Explode的Pandas DataFrame至原始形态?

解决方案:恢复经多列explode+merge后的原始行结构

核心思路

以**category和level_1的唯一组合**作为分组键,对爆炸拆分过的列执行聚合操作,将分散的元素重新组合为原始的列表格式;合并引入的列根据属性级别选择对应聚合方式——行级属性取唯一值,项级属性聚合为列表。


完整代码示例

1. 构造测试数据

import pandas as pd

# 原始待处理数据(含多列列表格式字段)
df_original = pd.DataFrame({
    'category': ['A', 'B'],
    'level_1': ['X', 'Y'],
    'color': [['red', 'blue'], ['green']],
    'Name': [['Alice', 'Bob'], ['Charlie']],
    'Name_2': [['Dave', 'Eve'], ['Frank']]
})

# 用于合并的关联数据(存储爆炸项的属性)
df_merge = pd.DataFrame({
    'color': ['red', 'blue', 'green'],
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Name_2': ['Dave', 'Eve', 'Frank'],
    'attribute': ['bright', 'dark', 'muted']
})

# 模拟你的explode+merge操作流程
df_exploded = df_original.explode('color').explode('Name').explode('Name_2')
df_merged = df_exploded.merge(df_merge, on=['color', 'Name', 'Name_2'], how='left')

2. 恢复原始行结构

# 分组聚合还原原始格式
df_restored = df_merged.groupby(['category', 'level_1'], as_index=False).agg(
    # 对爆炸列去重后重组为列表,避免笛卡尔积导致的重复元素
    color=('color', lambda x: list(pd.unique(x))),
    Name=('Name', lambda x: list(pd.unique(x))),
    Name_2=('Name_2', lambda x: list(pd.unique(x))),
    # 合并引入的项级属性聚合为列表;若为行级属性可用x.unique()[0]取唯一值
    attribute=('attribute', lambda x: list(pd.unique(x)))
)

期望输出示例

原始数据(df_original):

categorylevel_1colorNameName_2
AX[red, blue][Alice, Bob][Dave, Eve]
BY[green][Charlie][Frank]

恢复后数据(df_restored):

categorylevel_1colorNameName_2attribute
AX[red, blue][Alice, Bob][Dave, Eve][bright, dark]
BY[green][Charlie][Frank][muted]

关键说明

  • 分组键必须是原始行的唯一标识(category+level_1),确保聚合后行数与原始数据一致
  • 使用pd.unique()去重,避免多次explode产生的笛卡尔积重复元素污染结果
  • 合并列的聚合逻辑可灵活调整:
    • 若合并列是原始行级属性(每行对应唯一值),用lambda x: x.unique()[0]直接提取
    • 若合并列是爆炸项级属性(每个拆分项对应一个值),则聚合为列表保存所有关联属性

内容的提问来源于stack exchange,提问作者dimzev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:45