我想在DataFrame列上应用映射。对于熊猫,这是直截了当的:
df["infos"] = df2["numbers"].map(lambda nr: custom_map(nr, hashmap))
这将根据infos
函数写入custom_map
列,并使用lambda
语句中的数字行。
使用dask这并不是那么简单。 ddf
是一个dask DataFrame。 map_partitions
相当于在DataFrame的一部分上并行执行映射。
不有效,因为你没有在dask中定义类似的列。
ddf["infos"] = ddf2["numbers"].map_partitions(lambda nr: custom_map(nr, hashmap))
有谁知道如何在这里使用列?我根本不了解他们的API documentation。
答案 0 :(得分:7)
您可以使用.map方法,与Pandas完全相同
In [1]: import dask.dataframe as dd
In [2]: import pandas as pd
In [3]: df = pd.DataFrame({'x': [1, 2, 3]})
In [4]: ddf = dd.from_pandas(df, npartitions=2)
In [5]: df.x.map(lambda x: x + 1)
Out[5]:
0 2
1 3
2 4
Name: x, dtype: int64
In [6]: ddf.x.map(lambda x: x + 1).compute()
Out[6]:
0 2
1 3
2 4
Name: x, dtype: int64
可能会要求您提供meta=
关键字。这使dask.dataframe知道函数的输出名称和类型。从map_partitions
复制文档字符串:
meta : pd.DataFrame, pd.Series, dict, iterable, tuple, optional
An empty pd.DataFrame or pd.Series that matches the dtypes and
column names of the output. This metadata is necessary for many
algorithms in dask dataframe to work. For ease of use, some
alternative inputs are also available. Instead of a DataFrame,
a dict of {name: dtype} or iterable of (name, dtype) can be
provided. Instead of a series, a tuple of (name, dtype) can be
used. If not provided, dask will try to infer the metadata.
This may lead to unexpected results, so providing meta is
recommended.
For more information, see dask.dataframe.utils.make_meta.
所以在上面的示例中,我的输出将是名为'x'
和dtype int
的系列,我可以执行以下任一操作以更明确地
>>> ddf.x.map(lambda x: x + 1, meta=('x', int))
或
>>> ddf.x.map(lambda x: x + 1, meta=pd.Series([], dtype=int, name='x'))
这告诉dask.dataframe对我们的函数有什么期望。如果没有给出meta,那么dask.dataframe将尝试在一小段数据上运行你的函数。如果失败,它将引发错误请求帮助。