[英]How can I sort values within a Dask dataframe group?
我有這段代碼,它在變量“分組 A”和“分組 B”的每個唯一組合中生成自回歸項。
for i in range(1, 5):
df.loc[:,'var_' + str(i)] = df.sort_values(by='date']) \
.groupby(['grouping A', 'grouping B']) \
['target'].sum().shift(i).ffill().bfill().values
是否可以在不使用 Dask 計算的情況下對值進行排序、分組、移位,然后分配給新變量?
因此,如果您只想並行化 for 循環,您可以使用 dask.delayed 執行以下操作
ddf = dask.delayed(df)
results = []
for i in range(1, 5):
result = ddf.sort_values(by='date']) \
.groupby(['grouping A', 'grouping B']) \
['target'].sum().shift(i).ffill().bfill().values
results.append(result)
results = dask.compute(results)
for i, result in results:
df[...] = result # mutate dataframe as you like
也就是說,我們將數據幀包裝在 dask.delayed 中。 對它的任何方法調用都將是惰性的。 我們收集所有這些懶惰的方法調用,然后將它們與dask.compute
一起調用。 我們不想在此期間改變數據幀(那會很奇怪),所以我們之后再做。
如果您想使用大型數據框執行此操作,那么您可能希望改用 dask.dataframe。 這將不那么直接,但希望能很好地工作。 您真的應該注意sort_values
操作。 分布式排序是一個非常困難的問題並且非常昂貴。 如果可能,您希望將其最小化。
import dask.dataframe as dd
df = load distributed dataframe with `dd.read_csv`, `dd.read_parquet`, etc.
df = df.set_index('date').persist()
results = []
for i in range(1, 5):
results = ddf.groupby(['grouping A', 'grouping B']) \
['target'].sum().shift(i).ffill().bfill()
ddf2 = dd.concat([ddf] + results, axis=1)
這里我們使用set_index
而不是sort_values
並且我們確保只執行一次(它可能比這里的任何其他操作花費 10-100 倍的時間)。 然后我們使用普通的 groupby 等。計算(這很奇怪)所以我們之后做一個連接。
在 groupby-sum 之后,您可能會得到一個大大減少的數據幀。 為此使用 Dask.dataframe,然后放棄 Dask 並回到舒適的 Pandas 中
ddf = load distributed dataframe with `dd.read_csv`, `dd.read_parquet`, etc.
pdf = ddf.groupby(['grouping A', 'grouping B']).target.sum().compute()
... do whatever you want with a much smaller pandas dataframe ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.