2017-03-31 3 views
1

を使用するapplyまたはmapメソッドを使用して、DataFrameまたはSeriesの更新されたビューを返す代わりに、関数で渡されたnumpy配列を更新することができます。たとえば:Dask;変数の更新を適用する

In[1]: df = pd.DataFrame({'x': [1,2,3,4,5]}) 
In[2]: count = np.array([0]) 
In[3]: def increment(row, count): 
      count[0] += row 
In[4]: df.x.map(lambda row: increment(row, count)) 
Out[4]: 
    x 
0 None 
1 None 
2 None 
3 None 
4 None 
Name: x, dtype: object 
In[5]: count 
Out[5]: array([15]) 

私は、この動作がDaskをusins複製できるようにしたいのですが、これまでのところ、私の唯一の運がmap_partitions方法や回避策のビットとされています。 Daskは並列処理に複数のメモリ空間を使用していますが、私の例ではこれを使用するだけなので、データが存在するメモリ空間には問題がありますか?または、パンダまたはDask applyメソッドが入力DataFrame/Seriesのような形状でないものを返すように強制する方法がありますか?

+0

実際の目標は何ですか? daskタスクをグローバルな状態に変更することが可能かどうか尋ねていますか?あなたはカスタム集計を達成しようとしていますか? – MRocklin

+0

@MRocklin絶対にカスタムアグリゲーション。必要に応じて最小限の例を追加することができますが、これはより良い入力問題かもしれないと考えました。基本的に私は非常に大きなcsvを持っています。そのCSVには、異なる長さの配列を含む列があります。私は各配列を読み込み、各要素の別の配列を参照する必要があります。この最後の配列を使用して、約2000個の要素を持つ配列を更新します。私が言ったように、map_partitionsを使って作業することができますが、将来の参照のために、適用作業を取得できるかどうかを実際に知りたいと思うでしょう。 – Grr

答えて

0

一般的には、グローバル状態の変更がDask内でサポートされていないタスクに応じて異なります。

目標がカスタム集計の場合は、.reductionメソッドを使用できます。これは、各パーティションに適用された関数としてリダクションを記述し、その後の結合操作を記述できる場合にはうまく機能します。

目標がこれよりもカスタムの場合は、dask.delayedに切り替えることをお勧めします(these docsも参照)。

関連する問題