2015-09-09 90 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。非常感谢你报告它 - 如果你更新答案,这是一个错误,我会接受它! –