使用Pandas从另一个数据框中删除一个数据框

Fed*_*ile 1 python compare dataframe pandas difference

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

所以如果我df2等于:

     A  B
0  wer  6
1  tyu  7
Run Code Online (Sandbox Code Playgroud)

并且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
Run Code Online (Sandbox Code Playgroud)

最终结果应如下:

     A  B  C
0  qwe  5  a
1  rty  9  f
2  iop  1  k
Run Code Online (Sandbox Code Playgroud)

我能够通过使用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)
Run Code Online (Sandbox Code Playgroud)

小智 10

我发现的最干净的方法是使用要删除的数据帧的索引从 Pandas 中删除:

df1.drop(df2.index, axis=0,inplace=True)
Run Code Online (Sandbox Code Playgroud)

  • 我相信这并没有回答这个问题。它假设相同的行将具有相同的索引。但是,在问题中发布的示例中,情况并非如此。因此,您将从 df1 中删除索引为 0 和 1 的行。 (3认同)

jez*_*ael 7

使用merge带有filter by的外连接query,最后删除helper列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
Run Code Online (Sandbox Code Playgroud)