博客專欄

EEPW首頁 > 博客 > Pandas 對數(shù)值進行分箱操作的4種方法總結(jié)對比

Pandas 對數(shù)值進行分箱操作的4種方法總結(jié)對比

發(fā)布人:數(shù)據(jù)派THU 時間:2022-05-15 來源:工程師 發(fā)布文章

來源DeepHub IMBA

分箱是一種常見的數(shù)據(jù)預(yù)處理技術(shù)有時也被稱為分桶或離散化,他可用于將連續(xù)數(shù)據(jù)的間隔分組到“箱”或“桶”中。在本文中,我們將討論使用 python Pandas 庫對數(shù)值進行分箱的 4 種方法。


我們創(chuàng)建以下合成數(shù)據(jù)用于演示

import pandas as pd # version 1.3.5import numpy as npdef create_df():df = pd.DataFrame({'score': np.random.randint(0,101,1000)})return df
create_df()df.head()


數(shù)據(jù)包括 1000 名學(xué)生的 0 到 100 分的考試分數(shù)。而這次的任務(wù)是將數(shù)字分數(shù)分為值“A”、“B”和“C”的等級,其中“A”是最好的,“C”是最差的。
圖片

1、between & loc


Pandas .between 方法返回一個包含 True 的布爾向量,用來對應(yīng)的 Series 元素位于邊界值 left 和 right[1] 之間。
參數(shù)有下面三個:

  • left:左邊界
  • right:右邊界
  • inclusive:要包括哪個邊界??山邮艿闹禐?{“both”、“neither”、“l(fā)eft”、“right”}。


根據(jù)以下間隔規(guī)則將學(xué)生的分數(shù)分為等級:

  • A: (80, 100]
  • B: (50, 80]
  • C: [0, 50]


其中方括號 [ 和圓括號 ) 分別表示邊界值是包含的和不包含的。我們需要確定哪個分數(shù)在感興趣的區(qū)間之間,并為其分配相應(yīng)的等級值。注意看下面的不同的參數(shù)表示是否包含邊界




df.loc[df['score'].between(0, 50, 'both'), 'grade'] = 'C'df.loc[df['score'].between(50, 80, 'right'), 'grade'] = 'B'df.loc[df['score'].between(80, 100, 'right'), 'grade'] = 'A'

圖片
以下是每個分數(shù)區(qū)間的人數(shù):


df.grade.value_counts()

圖片
此方法需要為每個 bin 編寫處理的代碼,因此它僅適用于 bin 很少的情況。


2、cut


可以使用 cut將值分類為離散的間隔。此函數(shù)對于從連續(xù)變量到分類變量[2] 也很有用。
cut的參數(shù)如下:

  • x:要分箱的數(shù)組。必須是一維的。
  • bins:標量序列:定義允許非均勻?qū)挾鹊?bin 邊緣。
  • labels:指定返回的 bin 的標簽。必須與上面的 bins 參數(shù)長度相同。
  • include_lowest: (bool) 第一個區(qū)間是否應(yīng)該是左包含的。




bins = [0, 50, 80, 100]labels = ['C', 'B', 'A']df['grade'] = pd.cut(x = df['score'], bins = bins, labels = labels, include_lowest = True)


這樣就創(chuàng)建一個包含 bin 邊界值的 bins 列表和一個包含相應(yīng) bin 標簽的標簽列表。
圖片
查看每個區(qū)段的人數(shù)


df.grade.value_counts()

圖片

結(jié)果與上面示例相同。

3、qcut


qcut可以根據(jù)排名或基于樣本分位數(shù)將變量離散為大小相等的桶[3]。
在前面的示例中,我們?yōu)槊總€級別定義了分數(shù)間隔,這回使每個級別的學(xué)生數(shù)量不均勻。在下面的示例中,我們將嘗試將學(xué)生分類為 3 個具有相等(大約)數(shù)量的分數(shù)等級。示例中有 1000 名學(xué)生,因此每個分箱應(yīng)該有大約 333 名學(xué)生。
qcut參數(shù):
x:要分箱的輸入數(shù)組。必須是一維的。
q:分位數(shù)。10 表示十分位數(shù),4 表示四分位數(shù)等。也可以是交替排列的分位數(shù),例如[0, .25, .5, .75, 1.] 四分位數(shù)。
labels:指定 bin 的標簽。必須與生成的 bin 長度相同。
retbins: (bool) 是否返回 (bins, labels)。



df['grade'], cut_bin = pd.qcut(df['score'], q = 3, labels = ['C', 'B', 'A'], retbins = True)df.head()

圖片
如果 retbins 設(shè)置為 True 則會返回 bin 邊界。



print (cut_bin)>> [ 0. 36. 68. 100.]


分數(shù)間隔如下:

  • C:[0, 36]
  • B:(36, 68]
  • A:(68, 100]


使用 .value_counts() 檢查每個等級有多少學(xué)生。理想情況下,每個箱應(yīng)該有大約 333 名學(xué)生。



df.grade.value_counts()


圖片


4、value_counts


雖然 pandas .value_counts 通常用于計算系列中唯一值的數(shù)量,但它也可用于使用 bins 參數(shù) [4] 將值分組到半開箱中。


df['score'].value_counts(bins = 3, sort = False)

默認情況下, .value_counts 按值的降序?qū)Ψ祷氐南盗羞M行排序。將 sort 設(shè)置為 False 以按其索引的升序?qū)ο盗羞M行排序。
圖片
series 索引是指每個 bin 的區(qū)間范圍,其中方括號 [ 和圓括號 ) 分別表示邊界值是包含的和不包含的。返回series 的值表示每個 bin 中有多少條記錄。

與 .qcut 不同,每個 bin 中的記錄數(shù)不一定相同(大約)。.value_counts 不會將相同數(shù)量的記錄分配到相同的類別中,而是根據(jù)最高和最低分數(shù)將分數(shù)范圍分成 3 個相等的部分。分數(shù)的最小值為 0,最大值為 100,因此這 3 個部分中的每一個都大約在 33.33 范圍內(nèi)。這也解釋了為什么 bin 的邊界是 33.33 的倍數(shù)。
我們還可以通過傳入邊界列表來定義 bin 邊界。


df['score'].value_counts(bins = [0,50,80,100], sort = False)

圖片
這給了我們與示例 1 和 2 相同的結(jié)果。

總結(jié)


在本文中,介紹了如何使用 .between、.cut、.qcut 和 .value_counts 對連續(xù)值進行分箱。這里是本文的源代碼:https://colab.research.google.com/drive/1yWTl2OzOnxG0jCdmeIN8nV1MoX3KQQ_1?usp=sharing



*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉