合并含重复相同列的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
相关产品推荐
相关产品推荐

