pandas 中的扩展 dtypes 似乎有一个查询错误

tec*_*ife 6 pandas

(2/19/2019):我在 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")
Run Code Online (Sandbox Code Playgroud)

长错误消息的最后几行是:

文件“...\site_packages\numexpr\necompiler.py”,第 822 行,在评估 zip(names,arguments)] 文件“...\site_packages\numexpr\necompiler.py”,第 821 行,签名 = [( name, getType(arg)) for (name, arg) in File "...\site_packages\numexpr\necompiler.py", line 703, in getType raise ValueError("unknown type %s" % a.dtype.name)值错误:未知类型对象

非扩展 dtypes 工作正常:

df_test = df_test.astype(dtype={"col_test": np.int32})
df_test.query("col_test != 6")
Run Code Online (Sandbox Code Playgroud)

(ps 作为一个完全独立的问题,将 dtype 直接传递给 pd.DataFrame 构造函数是行不通的——似乎有问题)。

谢谢。

cs9*_*s95 17

扩展数据类型在 0.24 中首次引入,并且有很多问题需要解决。

也就是说,这似乎是 numexpr 和 pandas 之间的某种兼容性问题。这看起来肯定有问题,在它被修复之前,我们将不得不回到引擎'python'

df_test.query('col_test != 6', engine='python')

   col_test
0         4
1         5
Run Code Online (Sandbox Code Playgroud)

(更多信息query/ eval使用 pd.eval() 在 pandas 中进行动态表达式评估

尽管事实上你可以这样做

df_test.loc[df_test['col_test'] != 6]

   col_test
0         4
1         5
Run Code Online (Sandbox Code Playgroud)

这可能会快得多(使用engine='python'不会比 提供任何性能优势loc)。