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

pandas使用merge合并DataFrame后行数异常增多问题求助

行数异常增加的核心原因
  • merge操作匹配时对重复的合并键会生成笛卡尔积结果:当data_01中存在n行完全相同的合并键组合,data_02中对应存在m行相同的合并键组合时,合并后会生成n*m行数据,而非预期的n行。本次多了4行,说明存在两组各2个重复的合并键(22 + 22 - 2 - 2 = 4),或者一组4个重复的合并键,最终导致总数据多了4行。
  • 可执行以下代码快速确认重复情况:
# 统计data_01中合并键重复的行数
print(data_01[['Name', 'Platform', 'Year', 'Genre', 'Publisher']].duplicated().sum())
# 统计data_02中合并键重复的行数
print(data_02[['Name', 'Platform', 'Year', 'Genre', 'Publisher']].duplicated().sum())
解决方案

可根据实际业务场景选择对应处理方式:

场景1:重复的合并键属于无效重复数据

先对两个表的合并键去重后再合并:

# 对data_01按合并键去重,keep参数可选'first'(保留第一条)、'last'(保留最后一条)
data_01_dedup = data_01.drop_duplicates(subset=['Name', 'Platform', 'Year', 'Genre', 'Publisher'], keep='first')
# 对data_02按合并键去重
data_02_dedup = data_02.drop_duplicates(subset=['Name', 'Platform', 'Year', 'Genre', 'Publisher'], keep='first')
# 合并去重后的表
total_data = pd.merge(data_01_dedup, data_02_dedup, on=['Name', 'Platform', 'Year', 'Genre', 'Publisher'])

场景2:重复的合并键属于有效数据(比如同一款游戏的多笔销售记录)

先对两个表按合并键聚合销售数据后再合并:

# 按合并键分组,对NA_Sales求和(也可根据业务需求选均值、最大值等统计方式)
data_01_agg = data_01.groupby(['Name', 'Platform', 'Year', 'Genre', 'Publisher'], as_index=False)['NA_Sales'].sum()
# 按合并键分组,对EU_Sales聚合
data_02_agg = data_02.groupby(['Name', 'Platform', 'Year', 'Genre', 'Publisher'], as_index=False)['EU_Sales'].sum()
# 合并聚合后的表
total_data = pd.merge(data_01_agg, data_02_agg, on=['Name', 'Platform', 'Year', 'Genre', 'Publisher'])

最简方案(确认两个表行完全一一对应仅顺序不同时使用)

直接按合并键排序后按列拼接,跳过merge逻辑,百分百保证行数一致:

# 两个表按相同规则排序后重置索引
data_01_sorted = data_01.sort_values(by=['Name', 'Platform', 'Year', 'Genre', 'Publisher']).reset_index(drop=True)
data_02_sorted = data_02.sort_values(by=['Name', 'Platform', 'Year', 'Genre', 'Publisher']).reset_index(drop=True)
# 直接拼接EU_Sales列
total_data = pd.concat([data_01_sorted, data_02_sorted['EU_Sales']], axis=1)

内容的提问来源于stack exchange,提问作者박진영

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:39:04