English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Категориальные данные Pandas

Пример операции с категориальными данными Pandas

Данные обычно содержат повторяющиеся текстовые столбцы в реальном времени. Пол, страна/регион и коды等功能 всегда повторяются. Это примеры категориальных данных.
Категориальные переменные могут принимать有限的 и, как правило, фиксированное количество возможных значений. Помимо фиксированной длины, категориальные данные могут иметь порядок, но не могут выполняться числовые операции. Категория - это тип данных Pandas.

Категориальные данные типа полезны в следующих случаях

Строка переменной, содержащая только несколько различных значений. Преобразование такой строки переменной в категориальную переменную позволяет сэкономить память.

Словесный порядок переменных и логический порядок ("один", "два", "три") различаются. Преобразование в категории и указание порядка в категориях позволяет использовать логический порядок вместо словесного при сортировке и наименьшем/наибольшем значении.

Как сигнал других библиотек Python, эту колонку следует рассматривать как категориальную переменную (например, используя соответствующие статистические методы или типы графиков).

Создание объекта

Объект категории можно создавать несколькими способами. Ниже описаны различные методы:

Категории

Указав dtype в процессе создания объекта Pandas как "category".

 import pandas as pd
 s = pd.Series(["a","b","c","a"], dtype="category")
 print(s)

Результат выполнения таков:

 0 a
 1 b
 2 c
 3 a
 dtype: category
 Categories (3, object): [a, b, c]

Число элементов переданных в объект series равно 4, но количество категорий составляет 3. Это можно观察到 в выводе категорий.

pd.Categorical

Используя стандартный конструктор категории Pandas, мы можем создать объект категории.

pandas.Categorical(values, categories, ordered)

Посмотрим на пример-

 import pandas as pd
 cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
 print(cat)

Результат выполнения таков:

 [a, b, c, a, b, c]
 Categories (3, object): [a, b, c]

Давайте рассмотрим еще один пример

 import pandas as pd
 cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
 print(cat)

Результат выполнения таков:

 [a, b, c, a, b, c, NaN]
 Категории (3, объект): [c, b, a]

В этом случае, второй параметр указывает на категорию. Таким образом, любая значение, не существующее в категории, будет считаться NaN.
Теперь, посмотрим на следующий пример:

 import pandas as pd
 cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
 print(cat)

Результат выполнения таков:

 [a, b, c, a, b, c, NaN]
 Категории (3, объект): [c < b < a]

С логической точки зрения, этот порядок означает, что a больше b, а b больше c.

Описание

Используя команду .describe() для данных категориального типа, мы получаем похожий вывод в виде строки типа серии или данных.

 import pandas as pd
 import numpy as np
 cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
 df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
 print(df.describe())
 print(df["cat"].describe())

Результат выполнения таков:

    cat s
count    3 3
unique   2 2
top      c c
freq     2 2
count     3
unique    2
top       c
freq      2
Name: cat, dtype: object

Получение свойств категорий

Команда obj.cat.categories используется для получения категорий объекта.

 import pandas as pd
 import numpy as np
 s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
 print(s.categories)

Результат выполнения таков:

  Index([u'b', u'a', u'c'], dtype='object')

Команда obj.ordered используется для получения порядка объекта.

 import pandas as pd
 import numpy as np
 cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
 print(cat.ordered)

Результат выполнения таков:

   False

Функция возвращает false, так как мы не указали никакой порядок.

Переименование категорий

Переименование категорий выполняется через присвоение нового значения свойству series.cat.categories.

 import pandas as pd
 s = pd.Series(["a","b","c","a"], dtype="category")
 s.cat.categories = ["Group %s" % g for g in s.cat.categories]
 print(s.cat.categories)

Результат выполнения таков:

Index([u'Group a', u'Group b', u'Group c'], dtype='object')

Начальные категории [a, b, c] обновлены свойством s.cat.categories.

Добавление новых категорий

Использование метода Categorical.add_categories() позволяет добавить новые категории.

 import pandas as pd
 s = pd.Series(["a","b","c","a"], dtype="category")
 s = s.cat.add_categories([4])
 print(s.cat.categories)

Результат выполнения таков:

Index([u'a', u'b', u'c', 4], dtype='object')

Удаление категорий

Использование метода Categorical.remove_categories() позволяет удалить не нужные категории.

 import pandas as pd
 s = pd.Series(["a","b","c","a"], dtype="category")
 print(("Оригинальный объект:"))
 print(s)
 print(("После удаления:"))
 print(s.cat.remove_categories("a"))

Результат выполнения таков:

 Оригинальный объект:
 0 a
 1 b
 2 c
 3 a
 dtype: category
 Categories (3, object): [a, b, c]
 После удаления:
 0 NaN
 1 b
 2 c
 3 NaN
 dtype: category
 Categories (2, object): [b, c]

Сравнение категориальных данных

Категориальные данные можно сравнивать с другими объектами в трех случаях:

Сравнение равенства (== и !=) с объектами, длина которых такая же, как у категориальных данных (список, последовательность, массив и т.д.),

Когда сортировка == True и категории одинаковы, сравнение данных категории с другими данными категории (==, !=, >, >=,  < и <=).< div>    

Все сравнения категориальных данных и скалярных значений.

Смотрите следующий пример:

 import pandas as pd
 cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
 cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)
 print(cat>cat1)

Результат выполнения таков:

 0 False
 1 False
 2 True
 dtype: bool