(數據科學學習手札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的官方文檔,以上就是本文的全部內容,如有筆誤望指出!