如何合并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
相关产品推荐
相关产品推荐

