Учебники

Python Pandas — категорические данные

Часто в режиме реального времени данные включают в себя текстовые столбцы, которые являются повторяющимися. Такие функции, как пол, страна и коды, всегда повторяются. Это примеры для категориальных данных.

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

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

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

  • Лексический порядок переменной не совпадает с логическим порядком («один», «два», «три»). При преобразовании в категориальный и указании порядка в категориях сортировка и min / max будут использовать логический порядок вместо лексического порядка.

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

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

Лексический порядок переменной не совпадает с логическим порядком («один», «два», «три»). При преобразовании в категориальный и указании порядка в категориях сортировка и min / max будут использовать логический порядок вместо лексического порядка.

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

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

Категориальный объект может быть создан несколькими способами. Различные способы были описаны ниже —

категория

Указав dtype в качестве «категории» при создании объекта pandas.

Live Demo

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)

Давайте возьмем пример —

Live Demo

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]

Давайте иметь другой пример —

Live Demo

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 .

Теперь взглянем на следующий пример:

Live Demo

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 строки типа .

Live Demo

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 используется для получения категорий объекта .

Live Demo

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 используется для получения порядка объекта.

Live Demo

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.

Live Demo

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 (), можно добавлять новые категории.

Live Demo

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 () , нежелательные категории могут быть удалены.

Live Demo

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 и категории одинаковы.

все сравнения категориальных данных со скаляром.

Взгляните на следующий пример —

Live Demo

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

Его вывод выглядит следующим образом —