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

如何1:1合并已对齐的Pandas DataFrame并保留原行数?

解决Pandas合并对齐DataFrame时行数增多的问题

你需要合并两个行数相同、共同列col1/col2顺序完全一致且数据已对齐的DataFrame,但使用merge后行数超出原数据——核心原因是**merge基于列值匹配,当存在重复列值时会生成笛卡尔积**,比如示例中(2,2)出现两次,merge会将每个df1的(2,2)行与df2的所有(2,2)行匹配,导致行数翻倍。

要实现按行位置一一对应合并、保留原行数,有以下几种高效方法:

方法1:使用pd.concat按列拼接

直接按列拼接两个DataFrame,先移除df2中重复的共同列避免列名冲突:

import pandas as pd

df1 = pd.DataFrame(
   [
      {"col1": 1, "col2": 1, "unique_df1_val": "value1"},
      {"col1": 2, "col2": 2, "unique_df1_val": "value2"},
      {"col1": 2, "col2": 2, "unique_df1_val": "value3"},
   ]
)

df2 = pd.DataFrame(
   [
      {"col1": 1, "col2": 1, "unique_df2_val": "value4"},
      {"col1": 2, "col2": 2, "unique_df2_val": "value5"},
      {"col1": 2, "col2": 2, "unique_df2_val": "value6"},
   ]
)

# 移除df2中重复的共同列后按列拼接
merged_df = pd.concat([df1, df2.drop(columns=['col1', 'col2'])], axis=1)
print(merged_df)

输出结果:

col1  col2 unique_df1_val unique_df2_val
0     1     1         value1         value4
1     2     2         value2         value5
2     2     2         value3         value6

方法2:按索引合并(适用于索引不一致场景)

如果两个DataFrame的索引不统一,先重置索引再通过索引匹配合并:

# 重置索引确保行位置对齐
df1_reset = df1.reset_index(drop=True)
df2_reset = df2.reset_index(drop=True)

# 按索引合并,自动标记重复列
merged_df = df1_reset.merge(df2_reset, left_index=True, right_index=True, suffixes=('', '_drop'))
# 删除重复的共同列
merged_df = merged_df.drop(columns=['col1_drop', 'col2_drop'])

print(merged_df)

方法3:使用join方法

join默认按索引合并,同样先移除df2的重复共同列:

merged_df = df1.join(df2.drop(columns=['col1', 'col2']))
print(merged_df)

关键原理

merge是值匹配,会对共同列的所有匹配值做笛卡尔积;而concat/join是位置/索引匹配,当两个DataFrame行数相同且数据已对齐时,能严格按行的顺序一一合并,完美保留原行数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:05:41