pandas

时间:2017-10-18 08:37:16

标签: python python-2.7 pandas

无法理解如何在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

1 个答案:

答案 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