[英]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.