2017-08-15 6 views
2

私はパンダのデータフレームのオブジェクトの「複合体」のフィルタリングを行うために使用しています:複雑なフィルタリングが

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のデータフレームを持つ:

一方
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] 
正常に動作します

「複雑な」数式(つまりnp.sqrt)を実行すると、結果はもはやレイジーdask DataFrameではないという問題があると思います。

方法はありますか?フィルターをかけることができる新しい列を作成する必要がありますか、それとももっと良い方法がありますか?

答えて

0

np.sqrtda.sqrtに置き換えると、すべて正常に機能します。

import dask.array as da 

あなたはDASKシリーズのnp.sqrtがnumpyの配列を生成するので、あなたの計算では、このステップは怠け者ではなく、具体的な結果を強制することがあります。怠惰を維持し、すべてをdaskに準拠させるためには、dask同等の関数を使用してください。

+0

私は、dask.arrayの基本的な数学関数を探すとは思っていませんでした。 –

+0

将来、 'np.sqrt'を動作させることができます。あなたがしたことは分かりやすいものでした。 – MRocklin