检查DataFrame中的哪些列是分类的

时间:2015-04-22 16:03:36

标签: python pandas

我是Pandas的新手...当我不手动指定每个列类型时,我想以一种简单而通用的方式查找categorical中哪些列为DataFrame,与this SO question不同。 df创建时使用:

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

e.g。

           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

UPDATE(2018/02/04)问题假设数字列不是绝对的,@ Zero' s accepted answer solves this

要小心 - 正如@Sagarkar的评论所指出的那样并非总是如此。难点在于数据类型和分类/序数/标称类型是正交概念,因此它们之间的映射并不简单。 @ Jeff' s answer指定了实现手动映射的精确方式。

19 个答案:

答案 0 :(得分:34)

您可以使用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']

答案 1 :(得分:15)

我找到的方法是更新到Pandas v0.16.0,然后将数字dtypes排除在:

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

哪个有效,不提供任何类型的更改,也不再向NumPy添加更多类型。 the question's comments by @Jeff中的建议提示include=["category"],但这似乎无效。

NumPy类型: link

Numpy Types

答案 2 :(得分:9)

为后人。选择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

答案 3 :(得分:3)

#获取分类和数值变量

numCols = X.select_dtypes("number").columns
catCols = X.select_dtypes("object").columns
numCols= list(set(numCols))
catCols= list(set(catCols))

答案 4 :(得分:2)

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

答案 5 :(得分:2)

您可以使用以下代码获取分类列的列表:

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

直观地显示数字列:

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

希望有帮助。

答案 6 :(得分:2)

在将变量归类成为挑战时,我也遇到了类似的障碍。但是,我根据数据的性质提出了一些方法。这样可以为您的问题以及未来的数据提供一个通用而灵活的答案。

通常,数据分类是根据数据类型进行的,这有时可能会导致错误的分析。 (通常由df.select_dtypes(include = ['object','category']]完成)

方法

  • 该方法不是在列级别而是在行级别查看数据。这种方法将提供不同值的数量,这些值将自动将分类变量与数字类型区分开。

  • 也就是说,如果一行中唯一值的数量超过了一定数量的值 (这是为了让您决定在列中假定多少类别变量)

例如:if ['Dog', 'Cat', 'Bird', 'Fish', 'Reptile']构成特定列的五个唯一分类值,并且如果不同值的数量不超过该列中的五个唯一分类值,则该列将属于分类变量。

elif ['Dog', 'Cat', 'Bird', 'Fish', 'Reptile']构成特定列的五个唯一分类值,并且如果不同值的数量超过该列中的五个唯一分类值,则它们属于数字变量。

if [col for col in df.columns if len(df[col].unique()) <=5]:
     cat_var = [col for col in df.columns if len(df[col].unique()) <=5]  
elif [col for col in df.columns if len(df[col].unique()) > 5]:
     num_var = [col for col in df.columns if len(df[col].unique()) > 5]

# where 5 : presumed number of categorical variables and may be flexible for user to decide. 

为了更好地说明,我使用了ifelif。不需要直接在条件内进行换行。

答案 7 :(得分:1)

使用.dtypes

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

答案 8 :(得分:1)

通常列会获得字符串(或“对象”)或类别的pandas dtype。如果您要查找的列未在类别dtype下列出,则最好同时包括这两个列。

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

答案 9 :(得分:0)

这对我来说总是很有效:

categorical_columns = list(set(df.columns) - set(df.describe().columns))

答案 10 :(得分:0)

如果您只对哪些列的类型感兴趣,则不需要查询数据。

最快的方法(当 %%timeit-ing 时)是:

df.dtypes[df.dtypes == 'category'].index

(这会给你一个pandas的Index。如果你需要,你可以.tolist()从中获取一个列表。)

这是可行的,因为 df.dtypes 是一个 pd.Series 字符串(它自己的数据类型是 'object'),因此您实际上可以通过普通 Pandas 查询选择您需要的类型。< /p>

您的分类类型不是 'category',而是简单的字符串 ('object')?然后就是:

df.dtypes[df.dtypes == 'object'].index

您是否混合使用了 'object''category'?然后像往常一样使用 isin 查询多个匹配项:

df.dtypes[df.dtypes.isin(['object','category'])].index

答案 11 :(得分:0)

df.select_dtypes(exclude=["number"]).columns

这将帮助您直接显示所有非数字行

答案 12 :(得分:0)

首先,我们可以使用读取数据集时可用的默认类型来分离数据框。这将列出所有不同的类型和相应的数据。

for types in data.dtypes.unique():
    print(types)
    print(data.select_dtypes(types).columns)

答案 13 :(得分:0)

`categorical_values  = (df.dtypes == 'object')
categorical_variables = categorical_variables =[categorical_values.index[ind] 
for ind, val in enumerate(categorical_values) if val == True]

在第一行代码中,我们获得了一系列有关所有列的信息。该系列通过用布尔值表示哪一列是对象类型以及哪一列不是对象类型来提供信息。

在第二行中,我们使用通过枚举(通过索引和值进行迭代)的列表理解,以便我们可以轻松地找到属于类别类型的列并将其附加到categorical_variables列表中

答案 14 :(得分:0)

这可能会有所帮助。但是,您需要检查少于10个字符的列,或者需要手动检查具有唯一大于10个字符的唯一值的列。

def find_cate(df):
cols=df.columns
i=0
for col in cols:
    if len(df[col].unique())<=10:
        print(col,len(df[col].unique()))
        i=i+1
print(i)

答案 15 :(得分:0)

选择分类列名称

cat_features=[i for i in df.columns if df.dtypes[i]=='object']

答案 16 :(得分:0)

使用 pandas.DataFrame.select_dtypes 。可以通过'categorical'标志找到 categorical dtypes。对于字符串,您可以使用numpy object dtype

更多信息:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.select_dtypes.html

示例:

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')

答案 17 :(得分:0)

# 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']

答案 18 :(得分:0)

这将给出数据框中所有分类变量的数组。

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