Spec-Zone.ru › pandas 0.22

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

Это введение в тип данных категорий pandas, включая краткое сравнение с factor R.

Categoricals — это тип данных pandas, который соответствует категориальным переменным в статистике: переменная, которая может принимать только ограниченное и обычно фиксированное количество возможных значений (categories; levels в R). Примерами являются пол, социальный класс, группы крови, принадлежность к стране, время наблюдения или оценки по шкалам Ликерта.

В отличие от статистических категориальных переменных, категориальные данные могут иметь порядок (например, «полностью согласен» против «согласен» или «первое наблюдение» против «второе наблюдение»), но числовые операции (сложение, деление и т.д.) невозможны.

Все значения категориальных данных находятся либо в categories или np.nan. Порядок определяется порядком categories, а не лексикографическим порядком значений. Внутренняя структура данных состоит из массива categories и целочисленного массива codes, которые указывают на реальное значение в массиве categories.

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

  • Строковая переменная, состоящая только из нескольких различных значений. Преобразование такой строковой переменной в категориальную переменную сэкономит память, см. здесь.
  • Лексикографический порядок переменной не совпадает с логическим порядком («один», «два», «три»). Преобразуя в категориальную переменную и задавая порядок категорий, сортировка и min/max будут использовать логический порядок вместо лексикографического порядка, см. здесь.
  • В качестве сигнала другим библиотекам Python о том, что этот столбец должен обрабатываться как категориальная переменная (например, для использования подходящих статистических методов или типов графиков).

См. также документацию API по категориальным данным.

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

Категориальные 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

Использованием специальных функций:

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

См. документацию для cut().

Передачей объекта 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

В приведенных выше примерах, где мы передавали ключевое слово dtype='category', использовалось поведение по умолчанию:

  1. категории определяются по данным
  2. категории не упорядочены.

Чтобы управлять этим поведением, вместо передачи 'category', используйте экземпляр CategoricalDtype.

In [16]: from pandas.api.types import CategoricalDtype

In [17]: s = pd.Series(["a", "b", "c", "a"])

In [18]: cat_type = CategoricalDtype(categories=["b", "c", "d"],
   ....:                             ordered=True)
   ....: 

In [19]: s_cat = s.astype(cat_type)

In [20]: s_cat
Out[20]: 
0    NaN
1      b
2      c
3    NaN
dtype: category
Categories (3, object): [b < c < d]

Категориальные данные имеют специфический category тип данных:

In [21]: df.dtypes
Out[21]: 
A      object
B    category
dtype: object

Примечание

В отличие от функции factor в R, категориальные данные не преобразуют входные значения в строки, и категории будут иметь тот же тип данных, что и исходные значения.

Примечание

В отличие от функции factor в R, в настоящее время нет возможности назначить/изменить метки во время создания. Используйте categories для изменения категорий после создания.

Чтобы вернуться к исходному Series или массиву numpy, используйте Series.astype(original_dtype) или np.asarray(categorical):

In [22]: s = pd.Series(["a","b","c","a"])

In [23]: s
Out[23]: 
0    a
1    b
2    c
3    a
dtype: object

In [24]: s2 = s.astype('category')

In [25]: s2
Out[25]: 
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

In [26]: s2.astype(str)

© 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.21.1/categorical.html

Spec-Zone.ru

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