簡體   English   中英

如何對 Dask 數據框組中的值進行排序?

[英]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 計算的情況下對值進行排序、分組、移位,然后分配給新變量?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM