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

如何用df2仅更新df1中缺失的Marks列?pd.merge使用未达预期

解决方法

你可以用以下几种方式实现仅用df2的数据填充df1中Marks列的缺失值,同时保留df1原有有效值:

方法1:使用combine_first(推荐,逻辑简洁)

这个方法会自动用df2对应行的Marks值填充df1的缺失值,前提是先把两个DataFrame用共同字段对齐索引:

# 假设两个DataFrame的共同唯一标识是StudentID
# 先设置共同字段为索引
df1 = df1.set_index('StudentID')
df2 = df2.set_index('StudentID')

# 用df2的Marks填充df1的缺失值
df1['Marks'] = df1['Marks'].combine_first(df2['Marks'])

# 恢复原索引
df1 = df1.reset_index()

方法2:Merge后填充并清理多余列

如果你坚持用merge,可以在合并后手动处理多余列,只保留需要的结果:

# 按共同字段左连接,给df2的Marks列加后缀区分
merged_df = df1.merge(df2, on='StudentID', how='left', suffixes=('', '_from_df2'))

# 填充缺失值:当df1的Marks为空时,用df2的对应值替换
merged_df['Marks'] = merged_df['Marks'].fillna(merged_df['Marks_from_df2'])

# 删除多余的列,得到更新后的df1
df1_updated = merged_df.drop('Marks_from_df2', axis=1)

方法3:用映射字典定向更新

适合只需要更新缺失行的场景,避免全量合并:

# 把df2转换成StudentID到Marks的映射字典
marks_mapping = df2.set_index('StudentID')['Marks'].to_dict()

# 仅更新df1中Marks为空的行
df1.loc[df1['Marks'].isna(), 'Marks'] = df1.loc[df1['Marks'].isna(), 'StudentID'].map(marks_mapping)

为什么merge会出现额外列?

因为两个DataFrame都有Marks列,merge时会自动为重复列名添加后缀(比如Marks_x和Marks_y),所以需要手动清理或者用上面的方法规避。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:31:04