5

データ ワークフローの一部として、dask データフレーム列のサブセットの値を変更し、結果をさらに計算するために渡す必要があります。特に、列のマッピングとパーティションのマッピングの 2 つのケースに興味があります。データを操作するための推奨される安全でパフォーマンスの高い方法は何ですか? 各ホストに複数のワーカープロセスがあるクラスターで分散セットアップを実行しています。

ケース1。

実行したい:

res = dataframe.column.map(func, ...)

これはデータ系列を返すので、元のデータフレームは変更されていないと仮定します。たとえば、列をデータフレームに戻すのは安全dataframe['column']=resですか? おそらくそうではありません。.copy()でコピーを作成し、結果を次のように割り当てる必要があります。

dataframe2 = dataframe.copy()
dataframe2['column'] = dataframe.column.map(func, ...)

それを行う他の推奨される方法はありますか?

ケース2

データフレームのパーティションをマップする必要があります:

df.map_partitions(mapping_func, meta=df)

mapping_func()内でpartition[column].map、リスト内包表記を使用するか、単に作成することにより、選択した列の値を変更したいと考えています。繰り返しますが、パーティションを安全に変更し、マッピング関数から返すにはどうすればよいでしょうか?

マッピング関数によって受信されたパーティションは Pandas データフレーム (元のデータのコピーですか?) ですが、データをインプレースで変更しているときにクラッシュが発生します (ただし、例外/エラー メッセージは表示されません)。の呼び出しpartition.copy(deep=False)にも同じことが言えますが、機能しません。パーティションをディープ コピーしてから、その場で変更する必要がありますか? または、新しい/マップされた列データと元の/変更されていないシリーズ/列から常に新しいデータフレームを構築する必要がありますか?

4

1 に答える 1

4

dask.dataframe を安全に変更できます

次のような操作がサポートされ、安全です

df['col'] = df['col'].map(func)

これにより、タスク グラフが変更されますが、データは変更されません (関数funcが新しい系列を作成すると仮定)。

パーティションを安全に変更することはできません

map_partitionsパンダのデータフレームを適切に変更する関数が安全でない場合の2番目のケース。Dask は、データを再利用したり、必要に応じて関数を 2 回呼び出したりできることを期待しています。そのような関数がある場合は、最初にその関数内で Pandas データフレームのコピーを作成する必要があります。

于 2017-09-05T12:03:26.923 に答える