根据 Dask.Series 创建类别代码地图

Create a category-code map based off a Dask.Series

我有一个 Dask.Series 具有已知的分类数据类型。我想创建一个小数据框来显示关联的映射,而无需计算整个系列。我该如何实现?

import pandas as pd
import dask.dataframe as dd
from dask_ml.preprocessing import Categorizer

df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
df = dd.from_pandas(df, npartitions = 2)
df = Categorizer().fit_transform(df)

test = df['species']

以上代码在 dask 中创建了一个类别系列。通过使用 test.cat.codes,我可以将类别转换为如下代码:


> test.compute()
Out[5]: 
0         setosa
1         setosa
2         setosa
3         setosa
4         setosa
   
145    virginica
146    virginica
147    virginica
148    virginica
149    virginica
Name: species, Length: 150, dtype: category
Categories (3, object): [setosa, versicolor, virginica]

> test.cat.codes.compute()
Out[6]: 
0      0
1      0
2      0
3      0
4      0
      ..
145    2
146    2
147    2
148    2
149    2
Length: 150, dtype: int8

期望的结果是获得从类别到代码的映射,如下所示,直到最后才使用计算命令。

期望的输出:

Category      Code
setosa        0
versicolor    1
virginica     2

我尝试了很多东西,但它们都需要将系列转换为 pandas 系列或数据帧,这违背了使用 dask 的目的。我没有在 dask 中找到任何可以帮助我在不重新分区的情况下执行此操作的东西,我不想这样做。另请注意,虽然该示例出于设置目的可以访问 DataFrame,但我实际上无法访问原始数据框,因此它需要从系列“test”开始。

下面的怎么样:

category_mapping = dd.concat([test, test.cat.codes], axis=1)
category_mapping.columns = ["Category", "Code"]
category_mapping = category_mapping.drop_duplicates()
print(category_mapping.compute())

这会给你:

       Category  Code
0        setosa     0
50   versicolor     1
100   virginica     2