如何按匹配索引合并行不匹配的数据集并保留指定列
解决行不匹配数据集的合并与字段追加问题
示例数据
先看两个行条目不匹配的数据集,其中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
相关产品推荐
相关产品推荐

