Категориальные данные
Это введение в тип данных категорий 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', использовалось поведение по умолчанию:
- категории определяются по данным
- категории не упорядочены.
Чтобы управлять этим поведением, вместо передачи '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