为何Pandas两种非空字符串查询方法返回结果不同?
问题解答
这两种查询方式的差异,核心是Pandas对StringDtype列中pd.NA的比较逻辑处理不同:
对于布尔索引
df[df.fruit != '']:
StringDtype是Pandas专门的字符串类型,设计上明确了和空字符串的比较规则——pd.NA和''比较时,结果直接返回False,所以pd.NA对应的行被过滤掉,最终只保留非空且非NA的行。对于
df.query("fruit != ''"):
query方法使用的是Pandas表达式评估引擎,在这个环境下,pd.NA和''比较的结果是pd.NA而非布尔值。而query默认不会自动过滤NA结果的行,而是将NA视为等效于True来保留,所以包含pd.NA的行被留在结果里。
如果想让query的结果和布尔索引一致,可以加上na_action='ignore'参数,这样会自动过滤掉结果为NA的行:
df.query("fruit != ''", na_action='ignore')
执行后就会和df[df.fruit != '']得到完全相同的输出。
内容的提问来源于stack exchange,提问作者Rovsom
相关产品推荐
相关产品推荐

