Как преобразовать / переименовать категории в dask

#python #dask

#python #dask

Вопрос:

Я пытаюсь переименовать категории столбца dtype ‘category’ фрейма данных dask в серию чисел от 1 до len (категории).

В pandas я делал это следующим образом:

 df['name'] = dd.Categorical(df.name).codes
  

но в dask это не работает:

 Traceback (most recent call last):
  File "example.py", line 47, in <module>
    sys.exit(main(sys.argv))
  File "example.py", line 25, in main
    df['name'] = dd.Categorical(df.name).codes
AttributeError: module 'dask.dataframe' has no attribute 'Categorical'
  

Итак, я попытался получить категории и установить их, как описано в документации pandas.

 df['name'] = df['name'].astype('category')
cats = df.name.cat.categories
df.name.cat.categories = range(1, len(cats))
  

Но это также приводит к исключению:

 Traceback (most recent call last):
  File "example.py", line 50, in <module>
    sys.exit(main(sys.argv))
  File "example.py", line 26, in main
    cats = df.name.cat.categories
  File "[...]/dask/dataframe/core.py", line 3207, in __getattr__
    return self._property_map(key)
  File "[...]/dask/dataframe/core.py", line 3186, in _property_map
    out = self.getattr(self._series._meta_nonempty, key)
  File "[...]/dask/dataframe/core.py", line 258, in _meta_nonempty
    return meta_nonempty(self._meta)
  File "[...]/dask/dataframe/utils.py", line 329, in meta_nonempty
    return _nonempty_series(x, idx)
  File "[...]/dask/dataframe/utils.py", line 308, in _nonempty_series
    entry = s.cat.categories[0]
  File "[...]/pandas-0.19.0-py3.5-linux-x86_64.egg/pandas/indexes/base.py", line 1393, in __getitem__
    return getitem(key)
IndexError: index 0 is out of bounds for axis 0 with size 0
  

Как я могу переименовать категории в столбце dataframe dask?

Ответ №1:

Вы, вероятно, захотите взглянуть на df.column.cat.codes , в котором есть номера, которые вы ищете. Давайте рассмотрим пример:

Создайте набор данных игрушек в Pandas

 In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'x': ['a', 'b', 'a']})

In [3]: df['x'] = df.x.astype('category')

In [4]: df
Out[4]: 
   x
0  a
1  b
2  a
  

Преобразовать в Dask.dataframe

 In [5]: import dask.dataframe as dd

In [6]: ddf = dd.from_pandas(df, npartitions=2)
  

Проверить .cat.codes атрибут

 In [7]: ddf.x.cat.codes
Out[7]: 
dd.Series<getattr..., npartitions=1, divisions=(0, 2)>

Dask Series Structure:
divisions
0    int8
2     ...
dtype: int8

In [8]: ddf.x.cat.codes.compute()
Out[8]: 
0    0
1    1
2    0
dtype: int8
  

Перезаписать серию категорий серией кодов

 In [9]: ddf['x'] = ddf.x.cat.codes

In [10]: ddf.compute()
Out[10]: 
   x
0  0
1  1
2  0
  

Комментарии:

1. Интересно. Ваш пример кода отлично работает для меня. Спасибо. Но когда я пытаюсь использовать это на своем входе, он снова выходит из строя с IndexError: index 0 is out of bounds for axis 0 with size 0 .