用Dask掩码替换多个值

2024-04-28 15:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个Daskmask代码,当incol的值为1时,它在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


Tags: 数据代码ifmask语句条件daskset
1条回答
网友
1楼 · 发布于 2024-04-28 15:30:36

只要这些替换不依赖于不同行的值,因此可以以任何顺序应用,就可以通过.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函数中,掩码的第二个应用程序可能需要控制outcol中更改的值,或者将掩码应用于outcol列(需要注意的是,口罩的使用顺序必须不会导致计算错误,例如,将1重新映射为3,然后将3重新映射为1)

如果您的应用程序正在写入同一列outcol,那么您可能需要.replace.map选项(请参阅this answer了解这些选项之间的差异)

因此,在这种情况下,工作流将是:

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())

相关问题 更多 >