Python Pandas:使用tilde操作符返回带有两个过滤器的反向数据

Python Pandas:使用tilde操作符返回带有两个过滤器的反向数据,python,pandas,Python,Pandas,我正在使用isin对两个数据帧列进行过滤。目的是返回两个不同的数据帧:一个满足过滤条件,另一个不满足过滤条件。实际上,数据帧应该是完全相反的。然而,我似乎不能像我想象的那样使用tilde操作符 一个可重复的例子: raw_data = { 'id': ['s1', 's2', 's1', 's4', 's2', 's5', 's4', 's2'], 'car': ['ford', 'bmw', 'ford', 'mazda', 'ford', 'bmw', 'audi', 'b

我正在使用
isin
对两个数据帧列进行过滤。目的是返回两个不同的数据帧:一个满足过滤条件,另一个不满足过滤条件。实际上,数据帧应该是完全相反的。然而,我似乎不能像我想象的那样使用tilde操作符

一个可重复的例子:

raw_data = {
    'id': ['s1', 's2', 's1', 's4', 's2', 's5', 's4', 's2'], 
    'car': ['ford', 'bmw', 'ford', 'mazda', 'ford', 'bmw', 'audi', 'bmw']}

df_a = pd.DataFrame(raw_data, columns= ['id', 'car'])

values1 = ['s1', 's2']
values2 = ['bmw', 'ford']
df_a[(df_a['id'].isin(values1)) & (df_a['car'].isin(values2))]
返回以下内容:

    id  car
0   s1  ford
1   s2  bmw
2   s1  ford
4   s2  ford
7   s2  bmw
这是正确的。但如果尝试使用以下方法来扭转这种局面:

df_a[~(df_a['id'].isin(值1))和(df_a['car'].isin(值2))]

我得到:

    id  car
5   s5  bmw

但事实并非如此。我已尝试向第二个过滤器添加第二个瓷砖,但无法使其工作。我哪里做错了,或者有更好的方法吗?

您需要额外的括号:

In [411]:
df_a[~((df_a['id'].isin(values1)) & (df_a['car'].isin(values2)))]
#     ^                                                        ^
Out[411]:
   id    car
3  s4  mazda
5  s5    bmw
6  s4   audi

您所做的只是反转第一个条件。

另一个解决方案是在第二个过滤器中添加~如您在问题中所述。但是,您必须将“and”运算符更改为“or”运算符。下面是不同场景的摘要

埃德彻姆回答=~(A&B)=~A | ~B=我的回答

您所做的是~A&B,您所指的向第二个过滤器添加~A~的是~A&~B,相当于~A | B)。其中~='not'、&='and'、|='or'

此链接可能有助于解释原因:

编辑:

感谢AlexK的建议,以下是实际代码:

[6]中的
:df_a[~(df_a['id'].isin(值1));~(df_a['car'].isin(值2))]
#           ^                             ^ 
出[6]:
身份证车
3 s4马自达
5 s5宝马
6 s4奥迪

fwiw,我有一个类似的问题,只有一个条件,我认为这与以前的行为不同。您的解决方案解决了这个问题,因此非常感谢。请将实际代码和输出添加到您的答案中。(+1用于解释逻辑)