我曾经常常做过复杂的"过滤pandas DataFrame对象:
import numpy as np
import pandas as pd
data = pd.DataFrame(np.random.random((10000, 2)) * 512, columns=["x", "y"])
data2 = data[np.sqrt((data.x - 200)**2 + (data.y - 200)**2) < 1]
这不会产生任何问题。
但是我使用dask DataFrames:
ddata = dask.dataframe.from_pandas(data, 8)
ddata2 = ddata[np.sqrt((ddata.x - 200)**2 + (ddata.y - 200)**2) < 1]
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
<ipython-input-13-c2acf73dddf6> in <module>()
----> 1 ddata2 = ddata[np.sqrt((ddata.x - 200)**2 + (ddata.y - 200)**2) < 1]
~/anaconda3/lib/python3.6/site-packages/dask/dataframe/core.py in __getitem__(self, key)
2115 return new_dd_object(merge(self.dask, key.dask, dsk), name,
2116 self, self.divisions)
-> 2117 raise NotImplementedError(key)
2118
2119 def __setitem__(self, key, value):
NotImplementedError: 0 False
同时操作更简单:
ddata2 = ddata[ddata.x < 200]
工作正常。
我认为问题是,只要我做任何&#34;复杂&#34; math(即np.sqrt
)结果不再是懒惰的dask DataFrame。
有解决方法吗?我是否必须创建一个新列,然后我可以过滤或有更好的方法吗?
答案 0 :(得分:1)
如果您将np.sqrt
替换为da.sqrt
,那么一切正常。
import dask.array as da
您可能会注意到dask系列的np.sqrt
会生成一个numpy数组,因此计算中的这一步并不是懒惰的,而是会强制执行具体的结果。使用dask等效函数来保持懒惰并保持所有符合dask的条件。