Python - __contains__的反义词

4

常见问题

我想知道是否存在Python中与__contains__相反的方法(例如,类似于__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 或者 id2id2_array 的观察值;而对于 df2 ,我只想要那些 id1id1_array 并且 id2 不在 id2_array 的观察值。谁能帮我解答一下?提前感谢!

not insomething.__contains__(some_other_thing) is False - Łukasz Rogalski
抱歉,您是在询问 df_1 = df[(df.id1 != id1_array) | (~df.id2.isin(id2_array)] 吗? - EdChum
5个回答

3
要在纯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的情况下实现相同的结果,如果你足够努力的话。

编辑:算了——另外,apply在2.3+版本中已被弃用。 - Samuel
@Samuel 这里的 applypandas.Series 的一个方法:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html#pandas.Series.apply,因此它不是 Python 特定的方法。 - EdChum
哦,我没有注意到他在使用pandas方法,完全错过了那个标签。 - Samuel
2
@Samuel 虽然 OP 此处询问的是 __contains__ 的反函数,但他们应使用特定于此任务的内置 pandas 方法,因为它旨在快速执行此操作。 - EdChum
@EdChum 谢谢你的回答。也许你可以将你的答案概括一下,这样它就可以帮助到那些有着和我一样问题的人(请参见原帖中的一般问题部分)。 - Tomas
我加了更多的解释,希望它能让事情更清晰。 - EdChum

2

编辑:我没有注意到这是特别使用pandas的。我的答案可能不准确。

通常,魔术函数(任何以__开头和结尾的函数)不应该直接调用。在这种情况下,可以通过使用in关键字来引用__contains__。

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

1
不过当你需要传递一个可调用对象时,这种方法就行不通了,而这正是 OP 正在做的事情。 - Padraic Cunningham

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

0

非常抱歉回复晚了。如果你想分析一个字符是否在字符串中,你可以看看这个!它并不是很优化,但可能会起作用:))

 while yourCharacter == False:
    stringVariable = str(input("text"))

    for characterPosition in range(0, len(stringVariable)):
        characterTest = stringVariable[characterPosition]
        if characterTest == "yourCharacter":
            yourCharacter = True

这个(你可能已经知道),将使您能够使用yourCharacter变量来检查字符是否在字符串或输入中。

希望它能在某种程度上有所帮助,再次抱歉回复晚了 :)


0

__contains___的相反

使用方法如下:

list.__contains__('ABC') #true if ABC is present in list

not list.__contains__('ABC') # false if ABC is present in list

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接