Категориальные данные
Это введение в тип данных pandas categorical, включая краткое сравнение с factor R.
Categoricals — это тип данных pandas, соответствующий категориальным переменным в статистике. Категориальная переменная принимает ограниченное и обычно фиксированное число возможных значений (categories; levels в R). Примеры включают пол, социальный класс, группу крови, страну, время наблюдения или оценку по шкале Ликерта.
В отличие от статистических категориальных переменных, категориальные данные могут иметь порядок (например, «полностью согласен» против «согласен» или «первое наблюдение» против «второе наблюдение»), но числовые операции (сложение, деление и т. д.) невозможны.
Все значения категориальных данных либо в categories или np.nan. Порядок определяется порядком categories, а не лексическим порядком значений. Внутренне структура данных состоит из массива categories и целочисленного массива codes, которые указывают на реальное значение в массиве categories.
Тип данных categorical полезен в следующих случаях:
- Строковая переменная, состоящая только из нескольких различных значений. Преобразование такой строковой переменной в категориальную переменную позволит сэкономить память, см. здесь.
- Лексический порядок переменной не совпадает с логическим порядком («один», «два», «три»). Преобразовав в категориальную и указав порядок категорий, сортировка и min/max будут использовать логический порядок вместо лексического, см. здесь.
- Как сигнал другим библиотекам Python, что этот столбец следует обрабатывать как категориальную переменную (например, для использования подходящих статистических методов или типов графиков).
См. также документацию API по категориальным данным.
Создание объекта
Создание Series
Категориальные Series или столбцы в DataFrame могут быть созданы несколькими способами:
Указав dtype="category" при создании Series.
In [1]: s = pd.Series(["a", "b", "c", "a"], dtype="category") In [2]: s Out[2]: 0 a 1 b 2 c 3 a dtype: category Categories (3, object): [a, b, c]
Преобразовав существующий Series или столбец в тип category:
In [3]: df = pd.DataFrame({"A": ["a", "b", "c", "a"]})
In [4]: df["B"] = df["A"].astype('category')
In [5]: df
Out[5]:
A B
0 a a
1 b b
2 c c
3 a a
Используя специальные функции, такие как cut(), которые группируют данные в дискретные интервалы. См. пример по разбивке в документации.
In [6]: df = pd.DataFrame({'value': np.random.randint(0, 100, 20)})
In [7]: labels = ["{0} - {1}".format(i, i + 9) for i in range(0, 100, 10)]
In [8]: df['group'] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)
In [9]: df.head(10)
Out[9]:
value group
0 65 60 - 69
1 49 40 - 49
2 56 50 - 59
3 43 40 - 49
4 43 40 - 49
5 91 90 - 99
6 32 30 - 39
7 87 80 - 89
8 36 30 - 39
9 8 0 - 9
Передав объект pandas.Categorical в Series или назначив его DataFrame.
In [10]: raw_cat = pd.Categorical(["a", "b", "c", "a"], categories=["b", "c", "d"],
....: ordered=False)
....:
In [11]: s = pd.Series(raw_cat)
In [12]: s
Out[12]:
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (3, object): [b, c, d]
In [13]: df = pd.DataFrame({"A": ["a", "b", "c", "a"]})
In [14]: df["B"] = raw_cat
In [15]: df
Out[15]:
A B
0 a NaN
1 b b
2 c c
3 a NaN
Категориальные данные имеют специфический category тип данных:
In [16]: df.dtypes Out[16]: A object B category dtype: object
Создание DataFrame
Аналогично предыдущему разделу, где один столбец преобразовывался в категориальный, все столбцы в DataFrame могут быть пакетно преобразованы в категориальные либо во время, либо после создания.
Это можно сделать во время создания, указав dtype="category" в конструкторе DataFrame.
In [17]: df = pd.DataFrame({'A': list('abca'), 'B': list('bccd')}, dtype="category")
In [18]: df.dtypes
Out[18]:
A category
B category
dtype: object
Обратите внимание, что категории в каждом столбце отличаются; преобразование выполняется столбец за столбцом, поэтому категориями являются только метки, присутствующие в данном столбце.
In [19]: df['A'] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories (3, object): [a, b, c] In [20]: df['B']
© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/0.25.0/user_guide/categorical.html