Python Pandas - категориальные данные

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

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

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

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

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

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

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

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

категория

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

import pandas as pd

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

это output выглядит следующим образом -

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

это output выглядит следующим образом -

[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

это output выглядит следующим образом -

[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

это output выглядит следующим образом -

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

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

Описание

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

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()

это output выглядит следующим образом -

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 команда используется для получения categories of the object.

import pandas as pd
import numpy as np

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

это output выглядит следующим образом -

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

это output выглядит следующим образом -

False

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

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

Переименование категорий осуществляется путем присвоения новых значений параметрам series.cat.categoriesseries.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

это output выглядит следующим образом -

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

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

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

С помощью метода Categories.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

это output выглядит следующим образом -

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 ("Original object:")
print s

print ("After removal:")
print s.cat.remove_categories("a")

это output выглядит следующим образом -

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]

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

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

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

  • все сравнения (==,! =,>,> =, <и <=) категориальных данных с другой категориальной серией при упорядочении == 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

это output выглядит следующим образом -

0  False
1  False
2  True
dtype: bool