Python - 与__contains__相反

时间:2016-07-20 13:53:42

标签: python python-2.7 pandas dataframe

一般问题

我想知道是否存在与__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

谁能帮帮我呢?提前谢谢!

3 个答案:

答案 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