如何根据指定列移除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
相关产品推荐
相关产品推荐

