首页 > 解决方案 > 将 pd.cut() 与 map_partitions DASK 一起使用时出现问题

问题描述

我在将 dask 中的 map_partitions 函数的 pd.cut 应用到大 DataFrame 时遇到问题。在 pandas 中使用相同的 bin 和标签,我得到一个带有标签值的新列​​。

_dict = {'doc_faturamento': ['546102424238'], 'atraso': [0]}

_df = pd.DataFrame( data=_dict)

_df['periodo_atraso'] = pd.cut(x=_df['atraso'], bins=[-10,1, 7, 14, 21, 30, 45,60, 9999999999], labels=['PA/PD','1-7 días', '8-14 días', '15-21 dias', '22-30 dias', '31-45 dias', '46-60 dias', '+ de 60 dias'])

但是在 Dask 中,将以下代码应用于 dask 数据帧,结果是带有 bin 值的新列。

_dict = {'doc_faturamento': ['546102424238'], 'atraso': [0]}

_df = pd.DataFrame( data=_dict)

_df = dd.from_pandas(_df, npartitions=1)

_bins = [-10,0,1, 7, 14, 21, 30, 45,60, 9999999999]
_labels = ['PA/PD','1-7 días', '8-14 días', '15-21 dias', '22-30 dias', '31-45 dias', '46-60 dias', '+ de 60 dias']

_df['periodo_atraso'] = _df['atraso'].map_partitions(pd.cut,_bins,labels=_labels,meta=(None,int))

任何人都可以帮助定义参数吗?

标签: pythonpandasdask

解决方案


我发现使用 map_partitions 尽可能接近 pandas 进程通常会更好。在这种情况下,这意味着不是创建系列并分配它,而是映射到新版本的数据框:

def mapper(df):
    df['periodo_atraso'] = pd.cut(x=_df['atraso'], 
        bins=[-10,1, 7, 14, 21, 30, 45,60, 9999999999], 
        labels=['PA/PD','1-7 días', '8-14 días', '15-21 dias', '22-30 dias', '31-45 dias', '46-60 dias', '+ de 60 dias'])
    return df

new_df = df.map_partitions(mapper)

对于meta参数,您可以将少量数据作为 pandas 数据框输入,例如,

df_small = pd.DataFrame(data=_dict)
meta = mapper(df_small).iloc[:0]

推荐阅读