无法理解如何在pandas中执行“复杂”查询。 假设我有一个包含3列(a,dir,r)的数据框:
from pandas import DataFrame df = DataFrame({ 'a':[10, 15, 20, 30, 8, 14], 'dir': ['pos', 'abs', 'abs', 'neg', 'abs', 'pos'], 'r': ['vl', 'pr', 'vl', 'pr', 'vl', 'pr'] })
a dir r 10 pos vl 15 abs pr 20 abs vl 30 neg pr 8 abs vl 14 pos pr
我想获取所有数据,其中列中的值为> 4,同时dir< 4> 'abs'和r<> 'pr'(但是如果dir = abs和r = vl就可以了)。 所以查询结果应该是:
a dir r 10 pos vl 20 abs vl 30 neg pr 8 abs vl 14 pos pr
试图使用该查询:
df[(df.a > 4) & ((df.dir != 'abs') & (df.r != 'pr'))]
但显然这不是我想要做的,结果:
a dir r 10 pos vl
答案 0 :(得分:2)
似乎您需要&
(和)使用|
(或):
print (df[(df.a > 4) & ((df.dir != 'abs') | (df.r != 'pr'))])
a dir r
0 10 pos vl
2 20 abs vl
3 30 neg pr
4 8 abs vl
5 14 pos pr
或者:
print (df.query('a > 4 & dir != "abs" | r != "pr"'))
a dir r
0 10 pos vl
2 20 abs vl
3 30 neg pr
4 8 abs vl
5 14 pos pr
类似的输出是使用==
和~
反转布尔掩码:
print (df[(df.a > 4) & ~((df.dir == 'abs') & (df.r == 'pr'))])
a dir r
0 10 pos vl
2 20 abs vl
3 30 neg pr
4 8 abs vl
5 14 pos pr