Pandas:使用tilde运算符通过两个过滤器返回反向数据

RDJ*_*RDJ 4 python pandas

我正在使用两个DataFrame列进行过滤isin.目标是返回两个不同的DataFrame:一个满足过滤条件,另一个满足过滤条件.实际上,DataFrame应该是完全相反的.但是,我似乎无法以我认为的方式使用波浪号运算符.

一个可重复的例子:

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))]
Run Code Online (Sandbox Code Playgroud)

返回此:

    id  car
0   s1  ford
1   s2  bmw
2   s1  ford
4   s2  ford
7   s2  bmw
Run Code Online (Sandbox Code Playgroud)

哪个是对的.但如果尝试使用以下方法来反转:

df_a[~(df_a['id'].isin(values1)) & (df_a['car'].isin(values2))]

我明白了:

    id  car
5   s5  bmw
Run Code Online (Sandbox Code Playgroud)

这不是相反的.我已经尝试在第二个过滤器中添加第二个波形符,但无法使其正常工作.我哪里错了,或者有更好的方法吗?

EdC*_*ica 8

你需要额外的大括号:

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
Run Code Online (Sandbox Code Playgroud)

你所做的只是颠倒了第一个条件