【问题标题】:Python - opposite of __contains__Python - 与 __contains__ 相反
【发布时间】:2016-11-23 19:25:05
【问题描述】:

一般问题

我想知道是否存在与 __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 id2 /em> id2_array,而对于df2,我只想要id1 id1_array id2 不在的观察结果 id2_array.

谁能帮帮我?提前致谢!

【问题讨论】:

  • not in? something.__contains__(some_other_thing) is False?
  • 抱歉你问到df_1 = df[(df.id1 != id1_array) | (~df.id2.isin(id2_array)]

标签: python python-2.7 pandas dataframe


【解决方案1】:

要回答如何在纯 pandas 中执行此操作,您可以使用 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 这还将返回一个布尔系列,其中找到匹配项,使用 ~ 反转数组。

同样作为一般规则,除非不可能,否则避免使用apply,原因是apply 只是在df 上执行for 循环的语法糖,这不是矢量化的。如果你足够努力,通常有很多方法可以在不使用apply 的情况下达到相同的结果。

【讨论】:

  • edit: 没关系——另外,apply 在 2.3+ 中被弃用了
  • @Samuel here applypandas.Series 方法:pandas.pydata.org/pandas-docs/stable/generated/… 所以它不是特定于 python 的方法
  • 哦,我没注意到他用的是pandas方法,完全错过了那个标签
  • @Samuel 虽然 OP 在这里询问 __contains__ 的反函数,但他们应该使用专门针对此任务的内置 pandas 方法,因为它旨在快速完成此任务
  • @EdChum 感谢您的回答。也许您可以概括您的答案,以便对与我有相同问题的人有所帮助(请参阅原始帖子中的部分一般问题)?
【解决方案2】:

编辑:我没有注意到这是专门使用熊猫的。我的回答可能不准确。

一般来说,魔法函数(任何带有 __ 前后的函数)并不意味着直接调用。在这种情况下,__contains__ 是通过使用 in 关键字来引用的。

>>> a = ['b'] 
>>> 'b' in a 
True 
>>> 'b' not in a 
False 

【讨论】:

  • 当您需要传递 OP 正在执行的可调用对象时不需要。
【解决方案3】:

不,没有__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

【讨论】:

    猜你喜欢
    • 2016-11-27
    • 2011-05-18
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2011-11-24
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多