如何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
相关产品推荐
相关产品推荐

