#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
.