Категориальные данные
Это введение в тип данных pandas категориальные, включая краткое сравнение с factor R.
Categoricals — это тип данных pandas, соответствующий категориальным переменным в статистике. Категориальная переменная принимает ограниченное, и обычно фиксированное, количество возможных значений (categories; levels в R). Примерами являются пол, социальный класс, группа крови, принадлежность к стране, время наблюдения или оценка по шкалам Ликерта.
В отличие от статистических категориальных переменных, категориальные данные могут иметь порядок (например, «полностью согласен» против «согласен» или «первое наблюдение» против «второе наблюдение»), но числовые операции (сложение, деление, …) невозможны.
Все значения категориальных данных находятся либо в categories либо в np.nan. Порядок определяется порядком categories, а не лексикографическим порядком значений. Внутренне структура данных состоит из массива categories и целочисленного массива codes, которые указывают на реальное значение в массиве categories.
Тип данных категориальные полезен в следующих случаях:
- Строковая переменная, состоящая только из нескольких различных значений. Преобразование такой строковой переменной в категориальную переменную позволит сэкономить память, см. здесь.
- Лексикографический порядок переменной не совпадает с логическим порядком («один», «два», «три»). Преобразованием в категориальную и указанием порядка категорий сортировка и 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 dtype:
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.24.2/user_guide/categorical.html