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

pds*_*pds 25 python pandas

我是Pandas的新手... 当我不手动指定每个列类型时,我希望以一种简单而通用的方式查找categorical我的DataFrame列,而不是在这个SO问题中.在df与创建:

import pandas as pd
df = pd.read_csv("test.csv", header=None)
Run Code Online (Sandbox Code Playgroud)

例如

           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
Run Code Online (Sandbox Code Playgroud)

.

更新(2018/02/04)这个问题假设数字列不是绝对的,@ Zero 接受的答案解决了这个问题.

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

Zer*_*ero 38

您可以使用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']
Run Code Online (Sandbox Code Playgroud)

  • 那么数字列不能分类?我认为这不是一个很好的方法. (12认同)
  • @Astrid好吧,整个想法是您必须在进行编码之前检查哪些列是分类的。如果您已经有了编码,那么这意味着您_已经知道_此类列是分类的。 (2认同)

pds*_*pds 17

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

df.select_dtypes(exclude=["number","bool_","object_"])
Run Code Online (Sandbox Code Playgroud)

哪个有效,不提供任何类型的更改,并且不再向NumPy添加更多类型.在建议通过@Jeff问题的意见建议include=["category"],但似乎并没有工作.

NumPy类型: 链接

Numpy类型

  • 一个伟大的视觉。杰夫的“类别”示例在哪里适合? (2认同)
  • 当“dtype”实际上设置为“category”(而不是“object”)时,“include='category”和“include=['category']”都对我有用 (2认同)

Jef*_*eff 11

对于后代.选择dtypes的规范方法是.select_dtypes.您可以指定一个实际的numpy dtype或convertible,或'category',它不是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
Run Code Online (Sandbox Code Playgroud)


小智 6

# 获取分类变量和数值变量

numCols = X.select_dtypes("number").columns
catCols = X.select_dtypes("object").columns
numCols= list(set(numCols))
catCols= list(set(catCols))
Run Code Online (Sandbox Code Playgroud)


Shi*_*mar 5

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

dfName.select_dtypes(include=['object']).columns.tolist()
Run Code Online (Sandbox Code Playgroud)

直观地用于数字列:

dfName.select_dtypes(exclude=['object']).columns.tolist()
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


小智 5

选择分类列名称

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


Mic*_*ini 5

如果您只关心哪些列属于什么类型,则不需要查询数据。

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

df.dtypes[df.dtypes == 'category'].index
Run Code Online (Sandbox Code Playgroud)

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

这是有效的,因为df.dtypespd.Series字符串(它自己的 dtype 是'object'),因此您实际上可以通过正常的 pandas 查询选择所需的类型。

您的分类类型不是'category'简单字符串 ( 'object') 吗?然后只需:

df.dtypes[df.dtypes == 'object'].index
Run Code Online (Sandbox Code Playgroud)

'object'你有和的混合吗'category'?然后isin像平常一样使用来查询多个匹配项:

df.dtypes[df.dtypes.isin(['object','category'])].index
Run Code Online (Sandbox Code Playgroud)