0

我有一个已知的分类 dtype 的 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

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

4

1 回答 1

1

以下情况如何:

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
于 2020-11-16T18:36:47.057 回答