一般问题
我想知道是否存在与__contains__
相反的Python(即类似__notcontains__
)。
我的例子
我需要以下代码:
df_1 = df[(df.id1 != id1_array) | (df.id2.apply(id2_array.__contains__)]
df_2 = df[(df.id1 == id1_array) & (df.id2.apply(id2_array.__notcontains__)]
换句话说,在df1
我只想要id1
不在 id1_array1
或 {{1 } 位于 id2
,而对于id2_array
,我只想要df2
位于 id1
< strong>和 id1_array
不在 id2
。
谁能帮帮我呢?提前谢谢!
答案 0 :(得分:3)
要回答如何在纯大熊猫中执行此操作,您可以使用isin
并使用否定运算符~
来反转布尔序列:
df_1 = df[(df.id1 != id1_array) | (df.id2.isin(id2_array)]
df_2 = df[(df.id1 == id1_array) & (~df.id2.isin(id2_array)]
这比使用apply
更大的数据集更快,因为isin
已经过矢量化
当使用==
和!=
等比较运算符时,这将返回True/False
,其中数组值在相同位置相同/不同。如果您只是为了成员资格进行测试,即数组中是否存在值列表,那么使用isin
这也将返回一个布尔系列,其中找到匹配项,以反转数组使用~
。 / p>
同样作为一般规则,避免使用apply
,除非它不可能,原因是apply
只是在df上执行for
循环的语法糖而且这不是' t矢量化。如果你足够努力的话,通常有办法在不使用apply
的情况下获得相同的结果。
答案 1 :(得分:2)
一般来说,魔术函数(前后都有__的东西)并不是直接调用的。在这种情况下,使用in
关键字引用__contains__。
>>> a = ['b']
>>> 'b' in a
True
>>> 'b' not in a
False
答案 2 :(得分:2)
没有__notcontains__
方法或类似方法。使用x not in y
时,实际使用方法__contains__
,如下所示:
class MyList(list):
def __contains__(self, x):
print("__contains__ is called")
return super().__contains__(x)
l = MyList([1, 2, 3])
1 in l
# __contains__ is called
1 not in l
# __contains__ is called