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

Pandas连续合并新增列而非填充NaN值的问题求解

Pandas多补充表合并去重及缺失值填充方案

问题场景

现有三个Pandas DataFrame定义如下:

import pandas as pd

df_all = pd.DataFrame(columns=["uid", "a", "b"], data=[["uid1", 12, 15],
                                                    ["uid2", 13, 16],
                                                    ["uid3", 14, 17],
                                                    ["uid4", 15, 18]])

df_additional_info1 = pd.DataFrame(columns=["uid", "c", "d"], data=[["uid1", 12, 15],
                                                                   ["uid3", 14, 17]])

df_additional_info2 = pd.DataFrame(columns=["uid", "c", "d"], data=[["uid2", 12, 15]])

需将主表df_all依次与df_additional_info1、df_additional_info2合并,补充表仅包含主表未更新行的额外信息。当前执行以下合并操作后,结果出现*_x、*_y形式的重复列:

df_all = df_all.merge(df_additional_info1, how="left", on="uid")
df_all = df_all.merge(df_additional_info2, how="outer", on="uid")

需要实现合并后无重复列,且缺失值被正确填充的效果。

解决方案

方法一:先合并补充表,再关联主表

先将两个补充表合并为一个完整的补充信息表,再与主表做左连接,避免重复列生成:

# 合并两个补充表,按uid去重(确保每个uid仅保留一条记录)
df_combined_additional = pd.concat([df_additional_info1, df_additional_info2]).drop_duplicates(subset="uid")
# 主表左连接合并后的补充表,自动匹配对应uid的c、d列
df_final = df_all.merge(df_combined_additional, how="left", on="uid")

最终df_final的输出结果:

uidabcd
uid112151215
uid213161215
uid314171417
uid41518NaNNaN

方法二:分步合并后清理重复列

若需保留分步合并的中间过程,可在第二次合并后,用combine_first填充缺失值,再删除重复列:

# 第一步:主表左连接第一个补充表
df_all = df_all.merge(df_additional_info1, how="left", on="uid")
# 第二步:合并第二个补充表,此时会生成c_x、d_x(来自第一次合并)和c_y、d_y(来自第二次合并)列
df_all = df_all.merge(df_additional_info2, how="outer", on="uid")
# 用第二个补充表的非空值填充第一个补充表的缺失值
df_all["c"] = df_all["c_x"].combine_first(df_all["c_y"])
df_all["d"] = df_all["d_x"].combine_first(df_all["d_y"])
# 删除冗余的_x、_y列
df_all = df_all.drop(columns=["c_x", "c_y", "d_x", "d_y"])

该方法同样能得到与方法一一致的结果,适合需要跟踪每一步合并数据变化的场景。

内容的提问来源于stack exchange,提问作者Honza S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:20:15