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

如何获取两个DataFrame的差异数据集?df2为df1子集时生成df3

刚好处理过类似的需求,我给你拆解成两种常见场景来讲,你可以根据自己的实际情况选:

场景1:保留df1全列,只取不在df2里的行

这是最常用的情况——你想保留原数据的所有字段,只剔除那些已经在df2里的记录。

情况1.1:按行索引匹配(df2的索引是df1的子集)

如果df2是直接从df1里按索引筛选出来的子集,用索引差集最快捷:

# 提取df1中不在df2里的索引
unique_indexes = df1.index.difference(df2.index)
# 生成目标数据集df3
df3 = df1.loc[unique_indexes]

情况1.2:按整行内容匹配(索引不同但行内容是df1的子集)

如果df2的索引和df1不对应,但每行内容都是df1里有的,用merge方法最稳妥(尤其是有重复行的情况):

# 左连接df1和df2,标记行的来源
merged = df1.merge(df2, how='left', indicator=True)
# 只保留仅在df1中出现的行,然后删除标记列
df3 = merged[merged['_merge'] == 'left_only'].drop('_merge', axis=1)

要是你的数据没有重复行,也可以用更简洁的isin写法:

# 生成布尔掩码,标记哪些行不在df2里
mask = ~df1.isin(df2.to_dict('list')).all(axis=1)
df3 = df1[mask]

场景2:同时取df1独有的行和独有的列

如果你既要剔除df2里有的列,又要剔除df2里有的行,就需要分两步筛选:

# 第一步:提取df1中df2没有的列
unique_cols = df1.columns.difference(df2.columns)
# 第二步:提取df1中df2没有的行(这里用索引匹配为例,也可以换成上面的内容匹配方法)
unique_indexes = df1.index.difference(df2.index)
# 第三步:组合筛选结果得到df3
df3 = df1.loc[unique_indexes, unique_cols]

小提醒

  • 用merge方法比isin更适合处理有重复行的数据集,不容易出错;
  • 确保df1和df2对应列的数据类型一致,不然整行匹配可能会判断失误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:14:09