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的输出结果:
| uid | a | b | c | d |
|---|---|---|---|---|
| uid1 | 12 | 15 | 12 | 15 |
| uid2 | 13 | 16 | 12 | 15 |
| uid3 | 14 | 17 | 14 | 17 |
| uid4 | 15 | 18 | NaN | NaN |
方法二:分步合并后清理重复列
若需保留分步合并的中间过程,可在第二次合并后,用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.
相关产品推荐
相关产品推荐

