2014-11-14 44 views
13

我似乎無法得到一個簡單的dtype檢查與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 

,通常我們可以通過只比較名稱的D型的 做一個D型細胞檢查:

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 +中進行這些類型的檢查?

+4

所以除了下面solns,所述canoncial方式來選擇列> = 0.15.0是''df.select_dtypes(包括= [ '類別'])'' – Jeff

+0

這可能需要做的與事實t與來自numpy的其他數據類型相比,帽子'category'是pandas添加的數據類型。 –

回答

20

使用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' 
9

有一些方法。首先,D類的字符串再版的「類別」,而不是「絕對」,所以此工程:

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

不過說實在的,當你看到,這種比較給出了其他dtypes一個類型錯誤,所以你應該有將其包裝在try .. except ..塊中以使用它。


其他方法來檢查使用熊貓的內部:

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

In [43]: pd.core.common.is_categorical_dtype(df.cat_column) 
Out[43]: True 

那些不會出錯,但只要給假非類別列。例如:

In [44]: pd.core.common.is_categorical_dtype(df.x) 
Out[44]: False