2017-10-18 74 views
2

不能完全理解如何在熊貓中執行「複雜」查詢。 假設我有3列(一,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 <>'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 

回答

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 
+0

它適用於我所提供的例子。我會用我正在處理的工具檢查它,但現在看起來很自然。猜猜我對過濾數據和對過濾數據的理解錯誤。謝謝。 – Ivan