程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

一文速學-Pandas處理分類數據(Categorical data)詳解+代碼演示(一)

編輯:Python

目錄

前言

一、分類數據(Categorical data)

離散與分類

實例場景

二、創建

1.Series創建

標簽轉換

2.DataFrame創建

3.操作

1.CategoricalDtype函數

2.unique唯一標簽

三.轉換

點關注,防走丟,如有纰漏之處,請留言指教,非常感謝



前言

時至如今Pandas仍然是十分火熱的基於Python的數據分析工具,與numpy、matplotlib稱為數據分析三大巨頭,是學習Python數據分析的必經之路。Pandas提供了大量能使我們快速便捷地處理數據的函數和方法,它是使Python成為強大而高效的數據分析環境的重要因素之一。
使用Pandas進行數據預處理時需要對Pandas的基礎數據結構Series和DataFrame有一個基礎的了解。若是還不清楚的可以再去看看我之前的詳解博文:

一文速學-數據分析之Pandas數據結構和基本操作代碼

結合Pandas處理不同種類的數據,算下來共有重復值處理、缺失值處理、異常值處理等眾多處理數據的方法。但我們使用Pandas做數據分析進階操作,經常會使用到機器學習算法模型以及神經網絡等算法,需要我們對數據進行預處理操作,其中就有label標簽數據。而Pandas將此類標簽數據單獨提取出作為Catagorical data分類數據。了解處理此類型數據能夠高效提升對我們進行數據進行建模和分析。對數據分析處理感興趣的還可以閱讀博主前幾篇詳解博文:

一文速學-Pandas異常值檢測及處理操作各類方法詳解+代碼展示

一文速學-Pandas處理重復值操作各類方法詳解+代碼展示

一文速學-Pandas處理缺失值操作各類方法詳解

 以上三篇很容易學會,沒有比較難的實戰。此篇博客基於Jupyter之上進行演示,本篇博客的願景是希望我或者讀者通過閱讀這篇博客能夠學會方法並能實際運用,而且能夠記錄到你的思想之中。希望讀者看完能夠提出錯誤或者看法,博主會長期維護博客做及時更新。


一、分類數據(Categorical data)

分類是與統計中的分類變量相對應的數據類型。分類變量具有有限且通常固定的可能值數量(類別;R因子級別)。例如性別、社會階層、血型、國家歸屬、觀察時間或通過李克特量表進行的評級。

離散與分類

在學習該數據類型之前,我給大家稍微講講統計學的一些相關知識,方便大家後續理解函數的相關操作。根據數據類型我們可以可以將數據分為兩種類型:

在統計學中,數據按變量值是否連續可分為連續數據與離散數據兩種.

  1. 變離數據是指其數值只能用自然數或整數單位計算.例如,企業個數,職工人數,設備台數等,只能按計量單位數計數,這種數據的數值一般用計數方法取得.
  2. 反之,在一定區間內可以任意取值的數據叫連續數據,其數值是連續不斷的,相鄰兩個數值可作無限分割,即可取無限個數值.例如,生產零件的規格尺寸,人體測量的身高,體重,胸圍等為連續數據,其數值只能用測量或計量的方法取得.

性質:符號x如果能夠表示對象集合S中的任意元素,就是變量。如果變量的域(即對象的集合S)是離散的,該變量就是離散變量;如果它的域是連續的,它就是連續變量。

        與統計分類變量相比,分類數據可能有一個順序(例如“強烈同意”與“同意”或“第一次觀察”與“第二次觀察”),但不可能進行數值運算(加法、除法等)。 在R語言基礎之中,名義型變量和有序型變量稱為因子,這些分類變量的可能值稱為一個水平,level,例如good,better,best,都稱為一個level。由這些水平值構成的向量就稱為因子。我們發現R語言的因子和Pandas的Catagorical data數據類型幾乎差不多。分類數據的所有值要麼在類別中,要麼就是np.nan。順序是由類別的順序定義的,而不是值的詞匯順序。在內部,數據結構由一個類別數組和一個整數代碼數組組成,這些代碼指向類別數組中的實值。

實例場景

  • 僅由幾個不同值組成的字符串變量。將這樣的字符串變量轉換為分類變量將節省一些內存。
  • 變量的詞匯順序與邏輯順序不同(“一”、“二”、“三”)。通過轉換為分類並指定類別的順序,排序和最小/最大將使用邏輯順序而不是詞匯順序。
  • 作為向其他Python庫傳遞數據時,該列應被視為分類變量(例如,使用適當的統計方法或繪圖類型)。

二、創建

1.Series創建

通過Series創建只需要在創建語句後面加上dtype="catagory":

series_cate=pd.Series(["a", "b", "c", "a"], dtype="category")

通過DataFrame創建後使用一列astype直接轉換就好了:

df = pd.DataFrame({"A": ["a", "b", "c", "a"]})
df["B"] = df["A"].astype("category")
df.dtypes

標簽轉換

 通過使用自定義函數或者功能函數,例如cut(),能夠將數值特征通過范圍打上標簽:

df = pd.DataFrame({"value": np.random.randint(0, 100, 20)})
labels = ["{0} - {1}".format(i, i + 9) for i in range(0, 100, 10)]
df["group"] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)
df

通過Categorical函數可以實現更高級的標簽轉換:

raw_cat=pd.Categorical(df['group'], categories=['40 - 49','60 - 69'])
df["group2"] = raw_cat
df

可以去除空值保留想要保留的特征。

2.DataFrame創建

DataFrama可以整個轉化為Catagory

df = pd.DataFrame({"A": ["a", "b", "c", "a"],"B":[1,2,3,4]},dtype="category")
df.dtypes

或者和轉換一列一樣全部轉換為category:

df = pd.DataFrame({"A": ["a", "b", "c", "a"],"B":[1,2,3,4]})
df_cat = df.astype("category")
df_cat.dtypes

 

3.操作

1.CategoricalDtype函數

在上面傳遞dtype='category'的示例中參數均為默認,默認轉換的category的類別:.

  • 類別是從數據中推斷出來的。
  • 類別是無序的。

若需要控制上述兩種情況,需要引入CategoricalDtype函數:

from pandas.api.types import CategoricalDtype
s = pd.Series(["a", "b", "c", "a"])
cat_type = CategoricalDtype(categories=["b", "c", "d"], ordered=True)
s_cat = s.astype(cat_type)
s_cat

 

 

 上述代碼就是在默認情況下,轉換為category類型並沒有設定categories,可以通過CategoricalDtype後期加上去。

對於DataFrame也是如此:

from pandas.api.types import CategoricalDtype
df = pd.DataFrame({"A": ["a", "b", "c", "a"],"B":[1,2,3,4]})
cat_type = CategoricalDtype(categories=list("abcd"), ordered=True)
df_cat = df.astype(cat_type)
df_cat.info

 

2.unique唯一標簽

為了執行逐表轉換,整個DataFrame中的所有標簽都用作每列的類別,可以通過編程方式通過categories=pd.unique(df.to_numpy().ravel())確定categories參數。

df = pd.DataFrame({"A": ["a", "b", "c", "a"],"B":[1,2,3,4]})
categories = pd.unique(df['A'].to_numpy().ravel())
categories
array(['a', 'b', 'c'], dtype=object)

如果已經有了代碼和類別,那麼可以使用from_codes()構造函數在正常構造函數模式下保存分解步驟:

splitter = np.random.choice([0, 1], 5, p=[0.5, 0.5])
s = pd.Series(pd.Categorical.from_codes(splitter, categories=["train", "test"]))

 

三.轉換

我們知道Category可以通過Series和DataFrame來創建,那麼轉換成原格式也是一樣的:

Series.astype(original_dtype)
np.asarray(categorical)

點關注,防走丟,如有纰漏之處,請留言指教,非常感謝

以上就是本期全部內容。我是fanstuck ,有問題大家隨時留言討論 ,我們下期見。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved