Categorical類型

一 介紹

在數據中,一個列有可能會包含很多重複值,這時會對重複值進行分類。往往在使用過程中會通過unique、value_counts等函數對重複值進行唯一性的提取和重複個數的統計。而還有一類數據類型可以幫助統計對應的值和表示的鍵。這類數據在系統可以稱爲維度表,維度表包含了不同值,並將主要觀測存儲爲引用維度的整數鍵。
可以通過如下例子進行展示,在例子代碼中,這種按照整數展現的方式被稱爲分類或者字典編碼展現。不同值的數組可以被稱爲數據的類別、字典或者層級。

import  numpy as np
import  pandas as pd
values  = pd.Series([0, 1, 0, 0]*2)
dim = pd.Series(['apple', 'orange'])
new_value = dim.take(values)
print(new_value)

代碼顯示的new_value結果爲:
new_value結果
這種轉換往往可以降低存儲的開銷,主要包括兩個部分:1.重命名類別;2.在不改變已有的類別順序下添加一個新的類別

二 Categorical對象

2.1 什麼是Categorical

Categorical類型是Pandas擁有的一種特殊數據類型,這樣的類型可以包含基於整數的類別展示和編碼的數據。其存儲的數據結構可以如下圖展示,在圖中可以看出數據的type爲Category類型:
Categorical類型數據
在圖中,可以看出categorical類型數據包括兩列,一列是整數列,是對數據的表示,一列是源編碼數據,是整數列表示的原意思。

2.2 Categorical實例的創建

1. 通過astype函數
(1)在Pandas中,Series數據類型,通過astype函數進行轉換,可以生成Pandas.Categorical的實例

# 構造一個Series數據結構,並生成Categorical實例
fruit = pd.Series(['apple', 'orange', 'apple', 'apple']*2)
c_fruit = fruit.astype('category')
print(c_fruit)

代碼的結果爲:
Series轉換的結果
(2)DataFrame的數據某一列,使用astype函數進行轉換,可以生成Pandas.Categorical的實例

# 構造一個DataFrame數據結構,並生成一個Categorical實例
fruit = pd.Series(['apple', 'orange', 'apple', 'apple']*2)
df = pd.DataFrame({'fruit':fruit,
                   'basket_id': np.arange(8),
                   'count':np.random.randint(2, 16, size=8)})
c_dfruit = df['fruit'].astype('category')
print(c_dfruit)

在上述構造的DataFrame數據爲:
DataFrame結果
輸出的結果爲:
DataFrame輸出結果
2. 通過pd.Categorical直接創建
從其他Python序列類型直接生成pd.Categorical,進行創建,示例如下代碼:

使用pd.Categorical來構造Categorical實例
my_categorical = pd.Categorical(['apple', 'orange', 'orange', 'apple', 'orange'])
print(my_categorical)

結果生成如下:
生成結果
3.使用Categorical的from_codes構造函數
如果已經從數據源獲得了分類編碼數據,使用這種方法非常便捷,實例代碼如下:

# 使用from_codes構造函數構造Categorical實例
categories = ['apple', 'orange', 'banana']
codes = [0, 1, 2, 1, 0, 1]
my_categorical2 = pd.Categorical.from_codes(codes,categories)
print(my_categorical2)

輸出結果如下:
輸出的結果
4. 作爲計算結果
在Pandas中,使用pandas.qcut分箱函數進行數據分析,返回的數據結果爲Categorical實例
如下代碼所示,創建了10個隨機數,並對數據進行4分的分箱,並使用a,b,c,d來表示數據所在的分箱區間,通過展示如下,可以看出數據的返回結果爲Categorical類型

# 作爲qcut函數的結果返回Categorical實例
np.random.seed(12345)
draws = np.random.randn(10)
bins = pd.qcut(draws, 4, labels=['a', 'b', 'c', 'd'])
print(draws,'\n', bins)

分箱操作結果

三 Categorical的屬性

Categorical對象擁有categories 和codes兩個屬性。Categories屬性展示了數據的源編碼,codes展示了當前的整數代表。如下代碼所示:

# Categorical實例的屬性
categories = ['apple', 'orange', 'banana']
codes = [0, 1, 2, 1, 0, 1]
get_Categorical = pd.Categorical.from_codes(codes,categories)

g_categories = get_Categorical.categories
g_codes = get_Categorical.codes

print(g_categories)
print(g_codes)

生成的get_Categorical數據展示如下:
get_Categorical
其中g_categories的輸出結果爲:
g_categories
g_codes的輸出結果爲:
g_codes

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章