任何人都可以帮助解释为什么我在使用两种我认为等效的查询方法时得到不同的结果吗?我已经阅读了很多次文档,但我仍然无法弄清楚。我确信我一定遗漏或误解了一些基本的东西。
这是我的测试数据:
import pandas as pd
df = pd.DataFrame(
{
"fruit": ["apple", "banana", "cherry", "", pd.NA]
},
dtype = "string"
)
以下是不同的查询结果:
>>> df.query("fruit != ''")
fruit
0 apple
1 banana
2 cherry
4 <NA>
>>> df[df.fruit != '']
fruit
0 apple
1 banana
2 cherry
为什么第一个查询返回包含
<NA>
的行,而另一个查询则不返回?
经过更深入的调查,我得出的结论是,
query
方法和索引之间存在明显的实现差异。
我查看了代码,pandas.query使用了
eval
方法。此方法可以使用两种不同的解析器:pandas
和python
。
pandas
解析器是默认的,它会带来你得到的结果,包括<NA>
。
不太可能(我不知道为什么)
python
解析器不实现==
和!=
;但您可以使用 df.query("fruit > ''", parser="python")
并查看结果是否符合您的预期。