Часто в режиме реального времени данные включают в себя текстовые столбцы, которые являются повторяющимися. Такие функции, как пол, страна и коды, всегда повторяются. Это примеры для категориальных данных.
Категориальные переменные могут принимать только ограниченное и обычно фиксированное количество возможных значений. Помимо фиксированной длины, категориальные данные могут иметь порядок, но не могут выполнять числовые операции. Категориальными являются данные типа Pandas.
Категориальный тип данных полезен в следующих случаях:
-
Строковая переменная, состоящая только из нескольких разных значений. Преобразование такой строковой переменной в категориальную переменную сэкономит некоторую память.
-
Лексический порядок переменной не совпадает с логическим порядком («один», «два», «три»). При преобразовании в категориальный и указании порядка в категориях сортировка и min / max будут использовать логический порядок вместо лексического порядка.
-
В качестве сигнала для других библиотек Python, что этот столбец следует рассматривать как категориальную переменную (например, использовать подходящие статистические методы или типы графиков).
Строковая переменная, состоящая только из нескольких разных значений. Преобразование такой строковой переменной в категориальную переменную сэкономит некоторую память.
Лексический порядок переменной не совпадает с логическим порядком («один», «два», «три»). При преобразовании в категориальный и указании порядка в категориях сортировка и min / max будут использовать логический порядок вместо лексического порядка.
В качестве сигнала для других библиотек Python, что этот столбец следует рассматривать как категориальную переменную (например, использовать подходящие статистические методы или типы графиков).
Создание объекта
Категориальный объект может быть создан несколькими способами. Различные способы были описаны ниже —
категория
Указав dtype в качестве «категории» при создании объекта pandas.
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]
Число элементов, переданных объекту серии, равно четырем, а категорий — только три. Соблюдайте то же самое в выходных категориях.
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] Categories (3, object): [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] Categories (3, object): [c < b < a]
Логически, порядок означает, что a больше, чем b, а b больше, чем c .
Описание
Используя команду .describe () для категориальных данных, мы получаем аналогичный вывод для Series или DataFrame строки типа .
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 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 .
Добавление новых категорий
Используя метод Categoryorical.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')
Удаление категорий
Используя метод Categoryorical.remove_categories () , нежелательные категории могут быть удалены.
import pandas as pd s = pd.Series(["a","b","c","a"], dtype="category") print ("Original object:") print s print ("After removal:") print s.cat.remove_categories("a")
Его вывод выглядит следующим образом —
Original object: 0 a 1 b 2 c 3 a dtype: category Categories (3, object): [a, b, c] After removal: 0 NaN 1 b 2 c 3 NaN dtype: category Categories (2, object): [b, c]
Сравнение категориальных данных
Сравнение категориальных данных с другими объектами возможно в трех случаях —
-
сравнение равенства (== и! =) со спискообразным объектом (list, Series, array, …) той же длины, что и категориальные данные.
-
все сравнения (==,! =,>,> =, <и <=) категориальных данных с другой категориальной серией, если они упорядочены == True и категории одинаковы.
-
все сравнения категориальных данных со скаляром.
сравнение равенства (== и! =) со спискообразным объектом (list, Series, array, …) той же длины, что и категориальные данные.
все сравнения (==,! =,>,> =, <и <=) категориальных данных с другой категориальной серией, если они упорядочены == True и категории одинаковы.
все сравнения категориальных данных со скаляром.
Взгляните на следующий пример —
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
Его вывод выглядит следующим образом —