(2019年2月19日): 我在numexpr跟踪器中打开了一个报告: https://github.com/pydata/numexpr/issues/331
熊猫报告是: https://github.com/pandas-dev/pandas/issues/25369
除非我正在做我不应该做的事情, 可空int的新dtype扩展在数据帧上的QUERY方法似乎有一个错误(问题似乎出在numexpr软件包中):
df_test = pd.DataFrame(data=[4,5,6], columns=["col_test"])
df_test = df_test.astype(dtype={"col_test": pd.Int32Dtype()})
df_test.query("col_test != 6")
长错误消息的最后几行是:
文件“ ... \ site_packages \ numexpr \ necompiler.py”,第822行,在评估中 zip(名称,参数)]文件“ ... \ site_packages \ numexpr \ necompiler.py”,第821行,在 签名= [[(name,arg)的文件(...,site_packages \ numexpr \ necompiler.py“,行703,在getType中的((name,getType(arg))) 引发ValueError(“未知类型%s”%a.dtype.name)ValueError:未知类型对象
非扩展dtype可以正常工作:
df_test = df_test.astype(dtype={"col_test": np.int32})
df_test.query("col_test != 6")
(p.s。作为完全独立的问题,通过dtype 直接连接到pd.DataFrame构造函数无效-似乎有错误)。
谢谢。
答案 0 :(得分:1)
在0.24中首次引入了扩展dtype,并且有很多缺点可以解决。
也就是说,这似乎是numexpr和pandas之间的某种兼容性问题。这肯定看起来有问题,在解决之前,我们将不得不退回到'python'
引擎。
df_test.query('col_test != 6', engine='python')
col_test
0 4
1 5
(有关query
/ eval
的更多信息:Dynamic Expression Evaluation in pandas using pd.eval())
尽管您可以做到
df_test.loc[df_test['col_test'] != 6]
col_test
0 4
1 5
这可能会更快(使用engine='python'
不会比loc
带来任何性能优势)。