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

如何根据指定列移除DataFrame中存在于另一DataFrame的行?

Pandas 按指定列组合移除匹配行的实现

示例数据

先构造题目中的两个DataFrame:

import pandas as pd

df1 = pd.DataFrame({
    'A': [0, 3, 4, 6],
    'B': [45, 100, 30, 150],
    'val1': [20, 10, 30, 50],
    'val2': [200, 80, 60, 34],
    'val3': [100, 50, 10, 11]
})

df2 = pd.DataFrame({
    'A': [4, 0, 1],
    'B': [30, 45, 78],
    'val1': [80, 10, 10],
    'val2': [145, 80, 90],
    'val3': [90, 50, 18]
})

需求说明

仅依据A、B列的组合值,删除df1中那些在df2的A、B列存在相同组合的行,最后重置索引得到目标结果。

实现方法

方法1:使用merge结合indicator参数

通过左连接df1和df2的A、B列,利用indicator标记行的来源,筛选出仅存在于df1的行:

merged = df1.merge(df2[['A', 'B']], on=['A', 'B'], how='left', indicator=True)
final = merged[merged['_merge'] == 'left_only'].drop(columns='_merge').reset_index(drop=True)

方法2:使用isin结合元组反选

将df2的A、B列组合转为元组列表,用~取反筛选出不在列表中的行:

exclude_pairs = list(df2[['A', 'B']].itertuples(index=False, name=None))
final = df1[~df1[['A', 'B']].apply(tuple, axis=1).isin(exclude_pairs)].reset_index(drop=True)

方法3:利用集合差集运算

将两个DataFrame的A、B列组合转为集合,计算集合差集得到需要保留的组合,再筛选df1:

df1_pairs = set(df1[['A', 'B']].itertuples(index=False, name=None))
df2_pairs = set(df2[['A', 'B']].itertuples(index=False, name=None))
keep_pairs = df1_pairs - df2_pairs
final = df1[df1[['A', 'B']].apply(tuple, axis=1).isin(keep_pairs)].reset_index(drop=True)

结果验证

三种方法最终得到的final结果均为:

A    B  val1  val2  val3
0  3  100    10    80    50
1  6  150    50    34    11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:15:33