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

如何合并Pandas DataFrame,筛选两表指定列不匹配的行?

解决方法:提取两个DataFrame中Domain列的对称差集行

你用how="outer"的merge会保留所有Domain(包括两边共有的google.com、youtube.com),同时生成Sales_x和Sales_y两列,所以没法直接得到目标结果。以下是几种可行的实现方式:

方法一:concat+drop_duplicates(简洁高效,适合大数据)

将两个DataFrame合并后,按Domain列去重,仅保留出现过一次的行——两边共有的Domain会出现两次,会被自动过滤。

import pandas as pd

# 构造示例数据(实际使用时替换为你的数据)
df1 = pd.DataFrame({
    "Domain": ["google.com", "facebook.com", "youtube.com"],
    "Sales": [100, 200, 300]
})

df2 = pd.DataFrame({
    "Domain": ["google.com", "yahoo.com", "youtube.com"],
    "Sales": [100, 200, 300]
})

# 核心操作:合并后去重,保留仅出现一次的Domain行
result = pd.concat([df1, df2]).drop_duplicates(subset="Domain", keep=False)
print(result)

输出结果:

Domain  Sales
1  facebook.com    200
1     yahoo.com    200

方法二:outer merge后过滤空值

先执行外连接,再筛选出仅在单侧存在的行(这类行的其中一个Sales列会为空),最后合并Sales列:

merged = pd.merge(df1, df2, on="Domain", how="outer", suffixes=("_x", "_y"))
# 筛选仅在df1或仅在df2中存在的行
filtered = merged[(merged["Sales_x"].isna()) | (merged["Sales_y"].isna())]
# 合并Sales列,去掉空值
result = filtered.assign(Sales=filtered["Sales_x"].combine_first(filtered["Sales_y"]))[["Domain", "Sales"]]
print(result)

方法三:分别提取单侧差集再合并

直接筛选出df1独有的Domain行,加上df2独有的Domain行,再合并:

# 提取df1中Domain不在df2里的行
df1_only = df1[~df1["Domain"].isin(df2["Domain"])]
# 提取df2中Domain不在df1里的行
df2_only = df2[~df2["Domain"].isin(df1["Domain"])]
# 合并结果
result = pd.concat([df1_only, df2_only])
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:20:50