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

如何按匹配索引合并行不匹配的数据集并保留指定列

解决行不匹配数据集的合并与字段追加问题

示例数据

先看两个行条目不匹配的数据集,其中df2包含部分ID的补充内容,且存在数据类型差异:

import pandas as pd

# df1:需要保留全部数据的主数据集
df1 = pd.DataFrame({
    "ID": [1, 2, 3, 4, 5],
    "Item Name": ["Apple", "Banana", "", "Orange", "Mango"]
})

# df2:仅包含部分ID的补充信息,数据类型混合(字符串、数值)
df2 = pd.DataFrame({
    "ID": [2, 4, 6],
    "Item Name": [" (Yellow)", 100, " (Imported)"]
})

期望输出

保留df1所有ID,将df2对应ID的内容追加到Item Name列,最终只保留原df1的两列:

# 期望结果
expected_output = pd.DataFrame({
    "ID": [1, 2, 3, 4, 5],
    "Item Name": ["Apple", "Banana (Yellow)", "", "Orange100", "Mango"]
})

高效实现方案

用pandas的左连接+字符串拼接的方式,能处理数据类型差异、缺失值,且适配绝大多数类似场景:

# 1. 按ID左连接,确保df1的所有行都被保留
merged = df1.merge(df2, on="ID", how="left", suffixes=("", "_df2"))

# 2. 把df2的补充列统一转成字符串,无匹配的用空字符串填充
merged["Item Name_df2"] = merged["Item Name_df2"].astype(str).fillna("")

# 3. 拼接两个Item Name列,覆盖原df1的字段
merged["Item Name"] = merged["Item Name"] + merged["Item Name_df2"]

# 4. 只保留原df1需要的两列
result = merged[["ID", "Item Name"]]

print(result)

关键细节说明

  • 左连接(how="left"):强制保留df1的全部数据,不管df2有没有对应ID的条目
  • 类型统一(astype(str)):解决df2中数据类型混乱的问题,不管是数值、布尔还是其他类型,都转成字符串再拼接
  • 缺失值处理(fillna("")):df2中没有匹配的ID会生成NaN,转成空字符串避免拼接后出现无效内容
  • 场景适配:如果需要追加的是其他字段(比如Description),只需要修改merge的关联字段和拼接时的列名即可,逻辑完全通用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:41:02