Spec-Zone.ru › pandas 0.25

Категориальные данные

Это введение в тип данных 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API