Pandas 删除一个数据框中与另一个数据框中的列中的行共享公共值的行

Pandas drop rows in one dataframe that share a common value with a rows in a column of another dataframe

我有一个名为 x1 的数据框:

 FID  g1    g2    g3
  0   19    20    13
  1   16    11    14
  2   15    20    11

和一个名为 x2 的数据框:

 FID  g1   
  1   16  

我想更改 x1,使其不包含 x2 中的行:

 FID  g1    g2    g3
  0   19    20    13
  2   15    20    11

我试过:

x1 = pd.concat([x1,x2]).drop_duplicates(keep=False)

但认为这仅在数据框具有匹配模式时才有效。我可以只保留 x1 中不共享 x2 中的 FID 值的行吗?

您可以使用 pd.Series.isin 创建 x1FID 列中出现在 [=15= 的 FID 列中的值的布尔序列].

然后简单地使用 pd.DataFrame.loc 和运算符 ~ 来反转布尔系列和 select x1 的行,其值在 FID不要出现在x2FID列中:

cond = x1.FID.isin(x2.FID)
x1.loc[~cond] 
# output:
   FID  g1  g2  g3
0    0  19  20  13
2    2  15  20  11
x1.drop(x2['FID'])

输出

    FID  g1  g2  g3
 0    0  19  20  13
 2    2  15  20  11