如何使用 dask 映射列
How to map a column with dask
我想在 DataFrame 列上应用映射。使用 Pandas 这很简单:
df["infos"] = df2["numbers"].map(lambda nr: custom_map(nr, hashmap))
这会根据 custom_map
函数写入 infos
列,并使用数字中的行作为 lambda
语句。
有了 dask,事情就没那么简单了。 ddf
是一个 dask DataFrame。 map_partitions
相当于在DataFrame的一部分上并行执行映射。
这不有效,因为您没有像 dask 中那样定义列。
ddf["infos"] = ddf2["numbers"].map_partitions(lambda nr: custom_map(nr, hashmap))
有谁知道我如何在这里使用列?我根本不明白他们的API documentation。
您可以使用 .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'
和数据类型为 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 我们的函数有什么期望。如果没有给出元数据,那么 dask.dataframe 将在一小段数据上尝试 运行 你的函数。如果失败,它将引发错误请求帮助。
我想在 DataFrame 列上应用映射。使用 Pandas 这很简单:
df["infos"] = df2["numbers"].map(lambda nr: custom_map(nr, hashmap))
这会根据 custom_map
函数写入 infos
列,并使用数字中的行作为 lambda
语句。
有了 dask,事情就没那么简单了。 ddf
是一个 dask DataFrame。 map_partitions
相当于在DataFrame的一部分上并行执行映射。
这不有效,因为您没有像 dask 中那样定义列。
ddf["infos"] = ddf2["numbers"].map_partitions(lambda nr: custom_map(nr, hashmap))
有谁知道我如何在这里使用列?我根本不明白他们的API documentation。
您可以使用 .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'
和数据类型为 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 我们的函数有什么期望。如果没有给出元数据,那么 dask.dataframe 将在一小段数据上尝试 运行 你的函数。如果失败,它将引发错误请求帮助。