2015-09-09 54 views
4

我有麻煩的熊貓查詢功能,其中子表達式不包括任何框架的列。我希望下面給[True, False],但實際上它響應[False, True]熊貓查詢功能與子表達式,不包括列名

df = pd.DataFrame({'col1':[1,0]}) 

col1 
0  1 
1  0 

external_var = 'yes' 
df.eval('(@external_var == "yes") == col1') 

0  False 
1  True 

似乎問題不涉及到使用external_var,因爲

df.eval('("yes" == "yes") == col1') 給出了同樣的意外結果。

方面

我用例是書寫的系統來分分配給項目表,根據可以通過非程序員編寫規則。規則將取決於外部事件元數據(因此比較external_var),將其與幀中的列進行比較。查詢功能似乎是理想的選擇,但它看起來並不像預期的那樣。我嘗試閱讀源,但在PandasExprVisitor班的某處丟失。

我考慮過的一種解決方法是僅將每個外部數據分配給列,但是當元數據本身包含列表時,這似乎會中斷。

這些測試在jupyter中使用Pandas 0.16.2和numexpr 2.4.3運行。

回答

1

這是錯誤(GH11044),也許會在下一個主要版本里程碑中得到糾正。

In [9]: df.eval('("yes" == "yes")') 
Out[9]: False 
+0

感謝那@jezrael。我的表達式不是隻包含標量值,因爲我意識到在嘗試選擇一組行時這沒有任何意義。這樣的查詢,比如'1 == 1'給''True'一個'keyError',這是可以理解的。 但我認識到我的表達式包含僅包含標量值的子表達式。這些文檔規則是否也適用於子表達式?代碼確實運行,但結果不正確。 –

+0

我報告這個[問題](https://github.com/pydata/pandas/issues/11044) – jezrael

+0

雖然我同意他們應該是等同的,但他們不是:結果是不同的。我在你的bug報告中寫到了這一點,他們現在認爲這是個bug。非常感謝你報告它 - 如果你更新答案,這是一個錯誤,我會接受它! –