Проверьте, является ли столбец DataFrame категориальным

Я не могу получить простой dtype-check, работающий с Pandas 'улучшенной категорией в v0.15+. В основном я просто хочу что-то вроде is_categorical(column) -> True/False.

import pandas as pd
import numpy as np
import random

df = pd.DataFrame({
    'x': np.linspace(0, 50, 6),
    'y': np.linspace(0, 20, 6),
    'cat_column': random.sample('abcdef', 6)
})
df['cat_column'] = pd.Categorical(df2['cat_column'])

Мы видим, что dtype для категориального столбца - "категория":

df.cat_column.dtype
Out[20]: category

И обычно мы можем выполнить проверку dtype, просто сравнив ее с именем dtype:

df.x.dtype == 'float64'
Out[21]: True

Но это не работает, если вы пытаетесь проверить, если столбец x категоричен:

df.x.dtype == 'category'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-94d2608815c4> in <module>()
----> 1 df.x.dtype == 'category'

TypeError: data type "category" not understood

Есть ли способ выполнить эти типы проверок в pandas v0.15 +?

Ответ 1

Используйте свойство name для сравнения вместо этого, оно всегда должно работать, потому что это просто строка:

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4])
>>> arr.dtype.name
'int64'

>>> import pandas as pd
>>> cat = pd.Categorical(['a', 'b', 'c'])
>>> cat.dtype.name
'category'

Итак, чтобы подвести итог, вы можете получить простую и понятную функцию:

def is_categorical(array_like):
    return array_like.dtype.name == 'category'

Ответ 2

Во-первых, строковое представление dtype - это 'category' а не 'categorical', так что это работает:

In [41]: df.cat_column.dtype == 'category'
Out[41]: True

Но на самом деле, как вы заметили, это сравнение дает TypeError TypeError для других dtypes, так что вам придется заключить ее в блок try.. except...


Другие способы проверки с использованием внутренних органов панд:

In [42]: isinstance(df.cat_column.dtype, pd.api.types.CategoricalDtype)
Out[42]: True

In [43]: pd.api.types.is_categorical_dtype(df.cat_column)
Out[43]: True

Для некатегориальных столбцов эти операторы будут возвращать False вместо того, чтобы выдавать ошибку. Например:

In [44]: pd.api.types.is_categorical_dtype(df.x)
Out[44]: False

Для более старых версий pandas замените pd.api.types в приведенном выше фрагменте на pd.core.common.