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

合并多个DataFrame后如何去除重复组合以缩减行数?

问题描述

使用reduce和pd.merge合并一组DataFrame,合并键为Name、Number、Country,但同一键组下的多值列会生成笛卡尔积,导致行数冗余(示例中Jack的组合从期望的2行变成8行),需要将每组重复项的行数精简到最少。

尝试的代码

merged = reduce(lambda left, right: pd.merge(left, right, on=['Name', 'Number', 'Country'], how="outer"), list_of_dfs)

当前输出(冗余结果)

NameNumberCountryFruitSportStreetSchoolColorGrade
Jack23CanadaBananaBasketballKissMiddleBlue91
Jack23CanadaBananaBasketballKissHighBlue91
Jack23CanadaBananaBasketballBossMiddleBlue91
Jack23CanadaBananaBasketballBossHighBlue91
Jack23CanadaBananaSoccerKissMiddleBlue91
Jack23CanadaBananaSoccerKissHighBlue91
Jack23CanadaBananaSoccerBossMiddleBlue91
Jack23CanadaBananaSoccerBossHighBlue91

输入的6个DataFrame示例

DataFrame 1

NameNumberCountryFruit
Jack23CanadaBanana

DataFrame 2

NameNumberCountrySport
Jack23CanadaBasketball
Jack23CanadaSoccer

DataFrame 3

NameNumberCountryStreet
Jack23CanadaKiss
Jack23CanadaBoss

DataFrame 4

NameNumberCountrySchool
Jack23CanadaMiddle
Jack23CanadaHigh

DataFrame 5

NameNumberCountryColor
Jack23CanadaBlue

DataFrame 6

NameNumberCountryGrade
Jack23Canada91

期望输出(精简结果)

NameNumberCountryFruitSportStreetSchoolColorGrade
Jack23CanadaBananaBasketballKissMiddleBlue91
Jack23CanadaBananaSoccerBossHighBlue91

解决方案

核心思路是给每个键组(Name、Number、Country)内的行添加分组序号,合并时将序号也作为合并键,避免笛卡尔积,实现一对一匹配。

步骤1:给每个DataFrame添加分组内序号

定义函数为每个DataFrame的键组内生成连续序号:

import pandas as pd
from functools import reduce

def add_group_index(df):
    # 给每个键组内的行分配序号,从0开始
    df['_group_idx'] = df.groupby(['Name', 'Number', 'Country']).cumcount()
    return df

步骤2:处理所有输入DataFrame

# 给所有DataFrame添加分组序号
list_of_dfs_with_idx = [add_group_index(df) for df in list_of_dfs]

步骤3:包含序号的合并

合并时同时使用原键和分组序号,确保同一序号的行匹配:

merged = reduce(lambda left, right: pd.merge(left, right, on=['Name', 'Number', 'Country', '_group_idx'], how='outer'), list_of_dfs_with_idx)

步骤4:清理临时序号列

# 删除临时添加的序号列
merged = merged.drop('_group_idx', axis=1)

原理说明

原合并方式仅使用三个键,当某个DataFrame的同一键组存在多行时,merge会生成笛卡尔积(行数为各键组内行数的乘积)。添加分组序号后,每个键组内的第n行只会和其他DataFrame中同键组的第n行合并,最终行数等于所有DataFrame中同一键组的最大行数(示例中为2行),完美匹配期望结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:07:03