簡體   English   中英

用 Dask 掩碼替換多個值

[英]Replace multiple values with Dask mask

incol的值為 1 時,我有這個 Dask mask代碼在 Dask 數據幀中設置 3:

ddf['outcol'] = ddf['incol'].mask(ddf['incol'] == 1, 3)

現在,我必須替換給定 50 個條件的值,例如:

if `incol` == 1 then set 3
if `incol` == 2 then set 8
: : :
: : :

是否可以在單個 Dask 語句中執行此操作(不必是mask )?

只要這些替換不依賴於不同行的值,因此可以按任何順序應用,就可以使用.map_partitions來實現:

def apply_masks(df):
   # implement the mask logic here, for example
   df['outcol'] = df['incol'].mask(df['incol'] == 1, 3)
   return df

ddf = ddf.map_partitions(apply_masks)

請注意,重復應用.mask()存在潛在問題,因為它會覆蓋以前的結果。 因此,根據您的用例,在上述第二次應用掩碼的apply_masks function 中,可能需要控制outcol中的更改值或將掩碼應用於outcol列(需要注意的是,需要在這樣的情況下應用掩碼)不會導致計算錯誤的順序,例如 1 重新映射為 3,然后 3 重新映射為 1)。

如果您的應用程序是這樣的,您正在寫入同一列outcol ,那么您可能需要.replace.map選項(請參閱此答案以很好地解釋這些選項之間的區別)。

因此,在這種情況下,工作流程將是:

import pandas as pd
df = pd.DataFrame(range(10), columns=['incol'])

import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=3)

replace_logic = {
    1: 3,
    2: 8,
    3: 2,
    # and so on ...
}

ddf['outcol'] = ddf['incol'].map(replace_logic).fillna(ddf['incol']).astype('int')

print(ddf.compute())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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