2024-04-28 15:30:36 发布
网友
我有这个Daskmask代码,当incol的值为1时,它在Dask数据帧中设置3:
mask
incol
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实现这一点:
.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)
.mask()
apply_masks
outcol
如果您的应用程序正在写入同一列outcol,那么您可能需要.replace或.map选项(请参阅this answer了解这些选项之间的差异)
.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())
只要这些替换不依赖于不同行的值,因此可以以任何顺序应用,就可以通过
.map_partitions
实现这一点:请注意,重复应用
.mask()
存在潜在问题,因为它将覆盖以前的结果。因此,根据您的用例,在上面的apply_masks
函数中,掩码的第二个应用程序可能需要控制outcol
中更改的值,或者将掩码应用于outcol
列(需要注意的是,口罩的使用顺序必须不会导致计算错误,例如,将1重新映射为3,然后将3重新映射为1)如果您的应用程序正在写入同一列
outcol
,那么您可能需要.replace
或.map
选项(请参阅this answer了解这些选项之间的差异)因此,在这种情况下,工作流将是:
相关问题 更多 >
编程相关推荐