如何对比两个不同dataframe的id列并提取无匹配的唯一行
两个DataFrame按ID列取差异实现方案
以下提供R语言、Python两种实现方案,均支持输出你需要的两种结果格式。
方案1:R语言实现
首先构造示例数据:
df1 <- data.frame(id = c(1, 2, 3)) df2 <- data.frame(id = c(2, 3, 4))
输出格式1(全匹配带NA标记)
df_new <- merge(df1, df2, by = "id", all = TRUE) df_new$df1_id <- ifelse(df_new$id %in% df1$id, df_new$id, NA) df_new$df2_id <- ifelse(df_new$id %in% df2$id, df_new$id, NA) df_new <- df_new[, c("df1_id", "df2_id")]
输出结果和你要求的完全一致:
df1_id df2_id 1 1 NA 2 2 2 3 3 3 4 NA 4
输出格式2(仅输出两边独有ID)
df1_only <- setdiff(df1$id, df2$id) df2_only <- setdiff(df2$id, df1$id) df_new <- data.frame(id = c(df1_only, df2_only))
输出结果:
id 1 1 2 4
方案2:Python实现
首先构造示例数据:
import pandas as pd df1 = pd.DataFrame({"id": [1, 2, 3]}) df2 = pd.DataFrame({"id": [2, 3, 4]})
输出格式1(全匹配带NA标记)
df_new = pd.merge(df1, df2, on="id", how="outer") df_new["df1_id"] = df_new["id"].where(df_new["id"].isin(df1["id"]), pd.NA) df_new["df2_id"] = df_new["id"].where(df_new["id"].isin(df2["id"]), pd.NA) df_new = df_new[["df1_id", "df2_id"]].reset_index(drop=True)
输出结果和要求一致:
df1_id df2_id 0 1.0 <NA> 1 2.0 2.0 2 3.0 3.0 3 <NA> 4.0
输出格式2(仅输出两边独有ID)
df1_only = df1[~df1["id"].isin(df2["id"])]["id"] df2_only = df2[~df2["id"].isin(df1["id"])]["id"] df_new = pd.DataFrame({"id": pd.concat([df1_only, df2_only]).reset_index(drop=True)})
输出结果:
id 0 1 1 4
内容的提问来源于stack exchange,提问作者Rustam Semenov
相关产品推荐
相关产品推荐

