Метод set_categories
Метод set_categories аксессора cat применяется к категориальной Series
и полностью заменяет существующий набор категорий на новый. В первом
параметре передаётся список новых категорий. При необходимости можно
управлять поведением с помощью параметра ordered, который указывает,
следует ли упорядочивать категории.
Важно отметить, что метод set_categories не изменяет значения элементов
в Series, если они присутствуют в новом списке категорий. Если же
какое-то значение отсутствует в новых категориях, оно заменяется на
NaN. Также метод позволяет изменять порядок категорий, если
передать ordered=True.
Синтаксис
ser.cat.set_categories(new_categories, ordered=None)
Где:
- new_categories - список новых категорий (обязательный параметр);
-
ordered - логическое значение, указывающее, должны ли
категории быть упорядоченными (по умолчанию
None, оставляет текущий статус упорядоченности).
Пример
Давайте создадим категориальную Series и заменим её категории:
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'a', 'b'], dtype='category')
print(ser.cat.categories)
Результат выполнения кода:
Index(['a', 'b', 'c'], dtype='object')
Теперь установим новые категории:
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'a', 'b'], dtype='category')
ser = ser.cat.set_categories(['a', 'b', 'c', 'd', 'e'])
print(ser.cat.categories)
Результат выполнения кода:
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
Обратите внимание, что значения элементов остались прежними, так как все они присутствуют в новых категориях.
Пример
Давайте рассмотрим ситуацию, когда новые категории не содержат всех значений из данных:
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'a', 'b'], dtype='category')
ser = ser.cat.set_categories(['a', 'b'])
print(ser)
Результат выполнения кода:
0 a
1 b
2 NaN
3 a
4 b
dtype: category
Categories (2, object): ['a', 'b']
Как видно, значение 'c' было заменено на NaN,
поскольку его нет в новых категориях.
Пример
Теперь изменим порядок категорий, сделав их упорядоченными:
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'a', 'b'], dtype='category')
ser = ser.cat.set_categories(['c', 'b', 'a'], ordered=True)
print(ser.cat.categories)
print(ser.cat.ordered)
Результат выполнения кода:
Index(['c', 'b', 'a'], dtype='object')
True
Теперь категории упорядочены в порядке 'c' < 'b' < 'a'.
Пример
Метод set_categories также удобно использовать для
переименования категорий, передавая новые значения вместо старых:
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'a', 'b'], dtype='category')
ser = ser.cat.set_categories(['x', 'y', 'z'])
print(ser)
Результат выполнения кода:
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
dtype: category
Categories (3, object): ['x', 'y', 'z']
Все значения стали NaN, потому что старые категории
('a', 'b', 'c') не совпадают с новыми ('x', 'y', 'z').
Смотрите также
-
метод
rename_categories,
который переименовывает категории -
метод
reorder_categories,
который изменяет порядок категорий -
метод
add_categories,
который добавляет новые категории -
метод
remove_categories,
который удаляет категории