gpt4 book ai didi

pandas - 如何根据另一个 df 中存在的列值从数据框中删除行?

转载 作者:行者123 更新时间:2023-12-01 09:58:30 28 4
gpt4 key购买 nike

给定两个数据帧 A 和 B,它们都有“x”和“y”列,我如何才能高效删除 A 中它们的 (x, y) 对出现在 B 中的所有行。

我考虑过在 A 上使用行迭代器实现它,然后每对检查它是否存在于 B 中,但我猜这是效率最低的方法......

我尝试按照 Filter dataframe rows if value in column is in a set list of values 中的建议使用 .isin 函数但不能将它用于多列。

示例数据框:

A = pd.DataFrame([[1, 2], [1, 4], [3, 4], [2, 4]], columns=['x', 'y'])
B = pd.DataFrame([[1, 2], [3, 4]], columns=['x', 'y'])

运算后C应该包含[1,4]和[2,4]。

最佳答案

在 pandas master(或 future 的 0.13)中,isin 也将接受数据帧,但问题是它只查看每一列中的值,而不是列的精确行组合.

取自@AndyHayden 的评论(https://github.com/pydata/pandas/issues/4421#issuecomment-23052472),与集合类似的方法:

In [3]: mask = pd.Series(map(set(B.itertuples(index=False)).__contains__, A.itertuples(index=False)))
In [4]: A[~mask]
Out[4]:
x y
1 1 4
3 2 4

或更具可读性的版本:

set_B = set(B.itertuples(index=False))
mask = [x not in set_B for x in A.itertuples(index=False)]

与@Acorbe 的回答相比,这样做的可能优势在于它保留了 A 的索引并且不会删除 A 中的重复行(但这取决于您当然想要)。


正如我所说,0.13 将接受数据帧到 isin。但是,我认为这不会解决这个问题,因为索引也必须相同:

In [27]: A.isin(B)
Out[27]:
x y
0 True True
1 False True
2 False False
3 False False

您可以通过将其转换为字典来解决此问题,但现在它不会查看两列的组合,而是单独查看每一列:

In [28]: A.isin(B.to_dict(outtype='list'))
Out[28]:
x y
0 True True
1 True True
2 True True
3 False True

关于pandas - 如何根据另一个 df 中存在的列值从数据框中删除行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20677920/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com