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

合并含重复相同列的DataFrame时如何保持原行数不新增?

解决Pandas合并重复列组合时产生额外行的问题

你有两个共享name和age列(列名、条目完全一致)的DataFrame,各自包含独立的额外列,希望合并后保持原行数,但使用inner merge时因重复的(name, age)组合产生了额外行。

问题原因

使用merge(df1, how='inner')时,Pandas会对所有匹配name和age的行做笛卡尔积匹配。比如你的数据中,Sally+0的组合在两个DataFrame里各出现2行,merge会将这2行两两组合,导致原本的2行变成4行,最终总行数从6变为8,多出2行。

解决方案

方案1:按行位置横向拼接(适用于行顺序完全对应)

因为两个DataFrame的name和age列内容完全一致,且行顺序匹配,直接用pd.concat横向拼接,同时剔除重复的共同列:

import pandas as pd

# 原始数据定义
data1 = {
  "name": ["Sally", "Sally", "Micky", "Sally", "Sally", "Micky"],
  "age": [77, 44, 22, 0,0,0],
  "gender":["F", "F", "M", "F", "M", "M"]
}
df1 = pd.DataFrame(data1)

data2 = {
  "name": ["Sally", "Sally", "Micky", "Sally", "Sally", "Micky"],
  "age": [77, 44, 22,0,0,0],
  "home": ["Y", "N", "N", "N", "N", "Y"]
}
df2 = pd.DataFrame(data2)

# 合并操作
newdf = pd.concat([df1, df2.drop(['name', 'age'], axis=1)], axis=1)

执行后newdf的行数与原DataFrame一致,为6行。

方案2:添加临时行索引作为合并键(适用于行顺序可能不固定的场景)

如果无法保证两个DataFrame的行顺序完全对应,但需要每一行按原始位置匹配,可以添加临时行ID列,基于行ID+共同列进行合并:

# 添加临时行ID
df1['row_id'] = range(len(df1))
df2['row_id'] = range(len(df2))

# 基于row_id、name、age合并
newdf = df2.merge(df1, on=['row_id', 'name', 'age'], how='inner').drop('row_id', axis=1)

这种方式通过唯一的row_id确保每一行只匹配对应的行,避免重复组合产生的笛卡尔积,最终行数保持6行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:06:32