pandas中按ID匹配将指定列数据合并到目标表已有列的实现问题
pandas 按ID匹配仅更新原有列的实现方案
你之前合并出现列追加到末尾的原因是:直接merge后保留了所有新增列,没有将新列的值回写到原有列再删除冗余列。以下是两种满足需求的实现方案:
方案1:使用update方法(简洁高效,默认覆盖原有列值)
update方法会自动按索引对齐数据,仅更新已有列,不会新增冗余列,代码如下:
# 提取df2中需要用到的ID和待填充列,将ID设为索引 df2_fill = df2[["ID", "Color", "Size"]].set_index("ID") # 临时将df1的ID设为索引完成对齐更新 df1 = df1.set_index("ID") df1.update(df2_fill) # 恢复ID为普通列 df1 = df1.reset_index()
方案2:merge+填充逻辑(灵活可控,可保留df1原有非空值)
如果需要仅填充原有列的空值、不覆盖df1已有的非空数据,可以用这个方案:
# 左连接仅获取df2的待填充列,用后缀区分原有列和临时合并列 df_merge = df1.merge(df2[["ID", "Color", "Size"]], on="ID", how="left", suffixes=("", "_tmp")) # 用临时列的值填充原有列的空值 df_merge["Color"] = df_merge["Color"].fillna(df_merge["Color_tmp"]) df_merge["Size"] = df_merge["Size"].fillna(df_merge["Size_tmp"]) # 删除临时列得到最终结果 df1 = df_merge.drop(columns=["Color_tmp", "Size_tmp"])
两种方案均不会导入df2的其他列(比如示例中的Length列),匹配不到ID的行也会保留原有数据不变,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jacob Rantas
相关产品推荐
相关产品推荐

