Категориальные данные
Это введение в тип данных pandas категориальные, включая краткое сравнение с R’s factor.
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.23.4/categorical.html