Skip to main content
 首页 » 编程设计

python之使用 Pandas 从另一个数据帧中删除一个数据帧

2025年05月04日11langtianya

我有两个不同大小的数据帧(df1 和 df2)。我想从 df1 中删除存储在 df2 中的所有行。

所以如果我有 df2 等于:

     A  B 
0  wer  6 
1  tyu  7 

df1 等于:

     A  B  C 
0  qwe  5  a 
1  wer  6  s 
2  wer  6  d 
3  rty  9  f 
4  tyu  7  g 
5  tyu  7  h 
6  tyu  7  j 
7  iop  1  k 

最终结果应该是这样的:

     A  B  C 
0  qwe  5  a 
1  rty  9  f 
2  iop  1  k 

我能够通过使用 for 循环实现我的目标,但我想知道是否有更好、更优雅和高效的方式来执行此类操作。

这是我编写的代码,以备不时之需: 将 pandas 导入为 pd

df1 = pd.DataFrame({'A' : ['qwe', 'wer', 'wer', 'rty', 'tyu', 'tyu', 'tyu', 'iop'], 
                    'B' : [    5,     6,     6,     9,     7,     7,     7,     1], 
                    'C' : ['a'  ,   's',   'd',   'f',   'g',   'h',   'j',   'k']}) 
 
df2 = pd.DataFrame({'A' : ['wer', 'tyu'], 
                    'B' : [    6,     7]}) 
 
for i, row in df2.iterrows(): 
    df1 = df1[(df1['A']!=row['A']) & (df1['B']!=row['B'])].reset_index(drop=True) 

请您参考如下方法:

使用merge与外部连接与过滤器 query , 最后通过 drop 删除辅助列:

df = pd.merge(df1, df2, on=['A','B'], how='outer', indicator=True) 
       .query("_merge != 'both'") 
       .drop('_merge', axis=1) 
       .reset_index(drop=True) 
print (df) 
     A  B  C 
0  qwe  5  a 
1  rty  9  f 
2  iop  1  k