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

如何基于指定列合并Pandas DataFrame并覆盖其余列?

如何基于指定列匹配合并Pandas DataFrame并批量覆盖其余列?

需求:基于指定列(如Name、Gender、Age)匹配两个DataFrame,保留匹配列,用第二个DataFrame的值覆盖第一个DataFrame中匹配行的其余所有列,且无需手动指定所有待覆盖列名。

示例数据

import pandas as pd

df1 = pd.DataFrame(columns=["Name", "Gender", "Age", "LastLogin", "LastPurchase"])
df1.loc[0] = ["Bob", "Male", "21", "2023-01-01", "2023-01-01"]
df1.loc[1] = ["Frank", "Male", "22", "2023-02-01", "2023-02-01"]
df1.loc[2] = ["Steve", "Male", "23", "2023-03-01", "2023-03-01"]
df1.loc[3] = ["John", "Male", "24", "2023-04-01", "2023-04-01"]

df2 = pd.DataFrame(columns=["Name", "Gender", "Age", "LastLogin", "LastPurchase"])
df2.loc[0] = ["Steve", "Male", "23", "2022-11-01", "2022-11-02"]
df2.loc[1] = ["Simon", "Male", "23", "2023-03-01", "2023-03-02"]
df2.loc[2] = ["Gary", "Male", "24", "2023-04-01", "2023-04-02"]
df2.loc[3] = ["Bob", "Male", "21", "2022-12-01", "2022-12-01"]

期望结果

匹配Name、Gender、Age的行,用df2的非匹配列值覆盖df1,最终输出:

Name Gender Age   LastLogin LastPurchase
0    Bob   Male  21  2022-12-01   2022-12-01
1  Frank   Male  22  2023-02-01   2023-02-01
2  Steve   Male  23  2022-11-01   2022-11-02
3   John   Male  24  2023-04-01   2023-04-01

方法1:利用merge批量处理列(通用且保留原结构)

通过左连接合并后,批量处理带后缀的临时列,无需手动指定每一列:

# 定义匹配列
match_cols = ["Name", "Gender", "Age"]

# 左连接合并,给重复列添加后缀区分
merged_df = df1.merge(df2, on=match_cols, how='left', suffixes=('_x', '_y'))

# 筛选出所有非匹配列(即需要覆盖的列)
non_match_cols = [col for col in df1.columns if col not in match_cols]

# 批量更新并清理临时列
for col in non_match_cols:
    # 优先用df2的值,无匹配则保留df1原数据
    merged_df[col] = merged_df[f"{col}_y"].fillna(merged_df[f"{col}_x"])
    # 删除合并产生的临时列
    merged_df.drop([f"{col}_x", f"{col}_y"], axis=1, inplace=True)

print(merged_df)

方法2:设置索引后用update(简洁高效,原地修改)

update方法会直接用df2中匹配索引的行覆盖df1,适合只需要覆盖已有列的场景:

match_cols = ["Name", "Gender", "Age"]

# 将匹配列设为索引,用于对齐数据
df1.set_index(match_cols, inplace=True)
df2.set_index(match_cols, inplace=True)

# 用df2匹配的行更新df1,无匹配则保留原数据
df1.update(df2)

# 重置索引恢复原结构
df1.reset_index(inplace=True)

print(df1)

内容的提问来源于Stack Exchange,提问作者Jak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:39:36