python - 将 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))
任何人都可以帮助定义参数吗?
解决方案
我发现使用 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]
推荐阅读
- vb.net - 无法取消运行 SQL 查询的后台工作程序
- ruby - 为什么在 32 位 Linux 上需要从 Rust 编译的共享对象时出现编码错误?
- python - 用不同的值替换现有的 EC2 标签
- jquery - 具有 hasClass() 问题的多个选择器
- r - 如何使用 tryCatch() 忽略 R 中的 while 循环中的错误
- html - 在悬停时更改按钮文本
- c - 知道为什么 x 达到 0 然后 nan
- javascript - 是否可以使用 Javascript 将自定义过滤器应用于元素?
- java - Jackson ObjectMapper(没有自定义@JsonCreator)有没有办法将此Json解组到提供的Java Dto?
- node.js - 如何追踪节点网络代码中的错误?