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用于解释逻辑)