关于dask.dataframe对象中的map_partitions的问题

时间:2018-10-29 19:25:17

标签: python dataframe dask

我有一个名为pandas.DataFrame的{​​{1}}对象,我想通过并行化对它的缺失值进行插值。这就是我要做的:

df

结果是

def func(df):
    return df.interpolate(method='linear', axis=1)


ddf = dd.from_pandas(df, npartitions=8)
res = ddf.map_partitions(func)
res2 = res.compute()

print(res2)
0    None
1    None
2    None
3    None
4    None
5    None
6    None
7    None
dtype: object

编辑1 在遵循@mdurant建议之后,我将功能更改为此

type(res)
dask.dataframe.core.Series

现在结果就是预期的结果。

但是,关于此代码,我仍然有一些新手问题。下面的基准显示非并行版本比并行版本更快。

非并行:

def func(df):
    return df.interpolate(method='linear', axis=1, inplace=True) 

平行:

%time df.interpolate(method='linear', axis=1, inplace=True)
Interpolating missing values.
CPU times: user 19.5 s, sys: 162 ms, total: 19.7 s
Wall time: 19.8 s

load

此插值是一种按行操作(插值在res = ddf.map_partitions(func) %time res2 = res.compute() Interpolating missing values.Interpolating missing values. Interpolating missing values.Interpolating missing values. Interpolating missing values.Interpolating missing values. Interpolating missing values.Interpolating missing values. CPU times: user 29.1 s, sys: 2.3 s, total: 31.4 s Wall time: 26.5 s res.visualize() 中),因此任何块(线程)都可以运行而不会受到惩罚(分块发生在索引之间)。

1 个答案:

答案 0 :(得分:2)

这里的问题是inplace=True-这样,对interpolate的调用不会返回任何内容,因此func()的输出为None,您将获得看到的结果。通常,Dask函数应返回已处理的数据,而不是尝试就地更改数据。只需删除关键字,事情就可能起作用。