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

Я новичок в Pandas... Я хочу простой и общий способ найти, какие столбцы являются categorical в моем DataFrame, когда я не указываю вручную каждый тип столбца, в отличие от этого вопроса SO. df создается с помощью:

import pandas as pd
df = pd.read_csv("test.csv", header=None)

например

           0         1         2         3        4
0   1.539240  0.423437 -0.687014   Chicago   Safari
1   0.815336  0.913623  1.800160    Boston   Safari
2   0.821214 -0.824839  0.483724  New York   Safari

,

ОБНОВЛЕНИЕ (2018/02/04) Вопрос предполагает, что числовые столбцы НЕ являются категориальными, @Zero принятый ответ решает это.

БУДЬТЕ ОСТОРОЖНЫ - Как отмечает @Sagarkar, это не всегда так. Сложность заключается в том, что типы данных и категориальные/порядковые/номинальные типы являются ортогональными понятиями, поэтому сопоставление между ними не является простым. @Джефф ответ ниже указывает точный способ достижения ручного отображения.

Ответ 1

Вы можете использовать df._get_numeric_data(), чтобы получить числовые столбцы, а затем узнать категориальные столбцы

In [66]: cols = df.columns

In [67]: num_cols = df._get_numeric_data().columns

In [68]: num_cols
Out[68]: Index([u'0', u'1', u'2'], dtype='object')

In [69]: list(set(cols) - set(num_cols))
Out[69]: ['3', '4']

Ответ 2

Я нашел способ обновления до Pandas v0.16.0, а затем исключил число dtypes с помощью:

df.select_dtypes(exclude=["number","bool_","object_"])

Что работает, если типы не изменены и больше не добавляются в NumPy. Предложение в комментариях к вопросу @Jeff предлагает include=["category"], но это, похоже, не сработало.

NumPy Types: ссылка

Numpy Types

Ответ 3

Для потомков. Канонический метод выбора dtypes .select_dtypes. Вы можете указать фактический numpy dtype или convertible или категорию, которая не является numpy dtype.

In [1]: df = DataFrame({'A' : Series(range(3)).astype('category'), 'B' : range(3), 'C' : list('abc'), 'D' : np.random.randn(3) })

In [2]: df
Out[2]: 
   A  B  C         D
0  0  0  a  0.141296
1  1  1  b  0.939059
2  2  2  c -2.305019

In [3]: df.select_dtypes(include=['category'])
Out[3]: 
   A
0  0
1  1
2  2

In [4]: df.select_dtypes(include=['object'])
Out[4]: 
   C
0  a
1  b
2  c

In [5]: df.select_dtypes(include=['object']).dtypes
Out[5]: 
C    object
dtype: object

In [6]: df.select_dtypes(include=['category','int']).dtypes
Out[6]: 
A    category
B       int64
dtype: object

In [7]: df.select_dtypes(include=['category','int','float']).dtypes
Out[7]: 
A    category
B       int64
D     float64
dtype: object

Ответ 4

Используйте .dtypes

In [10]: df.dtypes
Out[10]: 
0    float64
1    float64
2    float64
3     object
4     object
dtype: object

Ответ 5

numeric_var = [key for key in dict(df.dtypes)
                   if dict(pd.dtypes)[key]
                       in ['float64','float32','int32','int64']] # Numeric Variable

cat_var = [key for key in dict(df.dtypes)
             if dict(df.dtypes)[key] in ['object'] ] # Categorical Varible

Ответ 6

Вы можете получить список категориальных столбцов, используя этот код:

dfName.select_dtypes(exclude=['int', 'float']).columns

И интуитивно для числовых столбцов:

dfName.select_dtypes(include=['int', 'float']).columns

Надеюсь, это поможет.

Ответ 7

Это даст массив всех категориальных переменных в кадре данных.

dataset.select_dtypes(include=['O']).columns.values

Ответ 8

# Import packages
import numpy as np
import pandas as pd

# Data
df = pd.DataFrame({"Country" : ["France", "Spain", "Germany", "Spain", "Germany", "France"], 
                   "Age" : [34, 27, 30, 32, 42, 30], 
                   "Purchased" : ["No", "Yes", "No", "No", "Yes", "Yes"]})
df

Out[1]:
  Country Age Purchased
0  France  34        No
1   Spain  27       Yes
2 Germany  30        No
3   Spain  32        No
4 Germany  42       Yes
5  France  30       Yes

# Checking data type
df.dtypes

Out[2]: 
Country      object
Age           int64
Purchased    object
dtype: object

# Saving CATEGORICAL Variables
cat_col = [c for i, c in enumerate(df.columns) if df.dtypes[i] in [np.object]]
cat_col
Out[3]: ['Country', 'Purchased']

Ответ 9

Используйте pandas.DataFrame.select_dtypes. Существуют категориальные dtypes, которые можно найти с помощью флага "категорический". Для строк вы можете использовать объект типа dumpy

Дополнительная информация: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.select_dtypes.html

Exemple:

import pandas as pd
df = pd.DataFrame({'Integer': [1, 2] * 3,'Bool': [True, False] * 3,'Float': [1.0, 2.0] * 3,'String': ['Dog', 'Cat'] * 3})
df

Out[1]:    
    Integer Bool    Float   String
0   1       True    1.0     Dog
1   2       False   2.0     Cat
2   1       True    1.0     Dog
3   2       False   2.0     Cat
4   1       True    1.0     Dog
5   2       False   2.0     Cat

df.select_dtypes(include=['category', object]).columns

Out[2]:
Index(['String'], dtype='object')

Ответ 10

'

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

cat_features = [i для я в df.columns, если df.dtypes [i] == 'object'] '