(數據科學學習手札68)pandas中的categorical類型及應用
- 2019 年 10 月 3 日
- 筆記
一、簡介
categorical是pandas中對應分類變量的一種數據類型,與R中的因子型變量比較相似,例如性別、血型等等用於表徵類別的變量都可以用其來表示,本文就將針對categorical的相關內容及應用進行介紹。
二、創建與應用
2.1 基本特性和適用場景
在介紹具體方法之前,我們需要對pandas數據類型中的categorical類型有一個了解,categorical類似R中的因子型變量,可以進行排序操作,但不可以進行數值運算操作,其順序在其被定義的時候一同確定,而不是按照數字字母詞法排序的順序,其適用場景有如下幾個:
1、具有少數幾種可能取值並存在大量重複的字符串字段,利用categorical類型對其轉換後可有效節省內存
2、字段的排序規則特殊,不遵循詞法順序時,可以利用categorical類型對其轉換後得到用戶所需的排序規則、
2.2 創建方式
pandas中創建categorical型數據主要有如下幾種方式:
1、對於Series數據結構,傳入參數dtype=’category’即可:
#直接創建categorical型Series series_cat = pd.Series(['B','D','C','A'], dtype='category') #顯示Series信息 series_cat
可以看到,series_cat的類型為category,但是沒有聲明順序,這時若對Series排序,實際上還是按照詞法的順序:
series_cat.sort_values()
2、對於DataFrame,在定義數據之後轉換類型:
#創建數據框 df_cat = pd.DataFrame({ 'V1':['A','C','B','D'] }) #轉換指定列的數據類型為category df_cat['V1'] = df_cat['V1'].astype('category') df_cat['V1']
3、利用pd.Categorical()生成類別型數據後轉換為Series,或替換DataFrame中的內容:
categorical_ = pd.Categorical(['A','B','D','C'], categories=['A','B','C','D']) series_cat = pd.Series(categorical_) series_cat
categorical_ = pd.Categorical(['A','B','D','C'], categories=['A','B','C','D']) df_cat = pd.DataFrame({ 'V1':categorical_ }) df_cat['V1']
而pd.Categorical()獨立創建categorical數據時有兩個新的特性,一是其通過參數categories定義類別時,若原數據中出現了categories參數中沒有的數據,則會自動轉換為pd.nan:
categorical_ = pd.Categorical(['A','B','D','C'], categories=['B','C','D']) df_cat = pd.DataFrame({ 'V1':categorical_ }) df_cat['V1']
另外pd.Categorical()還有一個bool型參數ordered,設置為True時則會按照categories中的順序定義從小到大的範圍:
categorical_ = pd.Categorical(['A','B','D','C'], categories=['A','B','C','D'], ordered=True) df_cat = pd.DataFrame({ 'V1':categorical_ }) df_cat['V1']
4、利用pandas.api.types中的CategoricalDtype()對已有數據進行轉換
通過CategoricalDtype(),我們可以結合astype()完成從其他類型數據向categorical數據的轉換過程,利用CategoricalDtype()的參數categories、ordered,彌補.astype(‘category’)的短板(實際上.astype(‘category’)等價於.astype(CategoricalDtype(categories=None, ordered=False))):
from pandas.api.types import CategoricalDtype #創建數據框 df_cat = pd.DataFrame({ 'V1':['A','C','B','D'] }) cat = CategoricalDtype(categories=['A','C','B'], ordered=True) df_cat['V1'] = df_cat['V1'].astype(cat) df_cat['V1']
2.3 應用
categorical型數據主要應用於自定義排序,如下例,我們創建了一個包含字符型變量class和數值型變量value的數據框:
import numpy as np df = pd.DataFrame({ 'class':np.random.choice(['A','B','C','D'],10), 'value':np.random.uniform(0,10,10) }) df.head()
如果按照class列排序得到的結果是按照字母自然順序:
df.sort_values('class')
而通過將class列修改為自己定義的排序方式則得到的結果如下:
from pandas.api.types import CategoricalDtype cat = CategoricalDtype(categories=['B','D','A','C'], ordered=True) df['class'] = df['class'].astype(cat) df.sort_values('class')
若想要臨時修改排序規則,可以使用.cat.reorder_categories()方法:
df['class'].cat.reorder_categories(['D','B','C','A'], ordered=True, inplace=True)#iinplace參數設置為True使得變動覆蓋原數據 df.sort_values('class')
關於pandas中的categorical型數據還有很多的小技巧,因為不常用這裡就不再贅述,感興趣可以查看pandas的官方文檔,以上就是本文的全部內容,如有筆誤望指出!