我有一个名为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
此插值是一种按行操作(插值在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()
中),因此任何块(线程)都可以运行而不会受到惩罚(分块发生在索引之间)。
答案 0 :(得分:2)
这里的问题是inplace=True
-这样,对interpolate
的调用不会返回任何内容,因此func()
的输出为None,您将获得看到的结果。通常,Dask函数应返回已处理的数据,而不是尝试就地更改数据。只需删除关键字,事情就可能起作用。