close

↓推薦關注↓

分箱是一種常見的數據預處理技術有時也被稱為分桶或離散化,他可用於將連續數據的間隔分組到「箱」或「桶」中。

在本文中,我們將討論使用 python Pandas 庫對數值進行分箱的 4 種方法。

我們創建以下合成數據用於演示

importpandasaspd#version1.3.5importnumpyasnpdefcreate_df():df=pd.DataFrame({'score':np.random.randint(0,101,1000)})returndfcreate_df()df.head()

數據包括 1000 名學生的 0 到 100 分的考試分數。而這次的任務是將數字分數分為值「A」、「B」和「C」的等級,其中「A」是最好的等級,「C」是最差的等級。

1、between & loc

Pandas .between 方法返回一個包含 True 的布爾向量,用來對應的 Series 元素位於邊界值 left 和 right 之間。

參數有下面三個:

left:左邊界
right:右邊界
inclusive:要包括哪個邊界。可接受的值為 {「both」、「neither」、「left」、「right」}。

根據以下間隔規則將學生的分數分為等級:

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

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

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'

以下是每個分數區間的人數:

df.grade.value_counts()C 488B 310A 202Name: grade, dtype: int64

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

2、cut

可以使用 cut將值分類為離散的間隔。此函數對於從連續變量到分類變量也很有用。

cut的參數如下:

x:要分箱的數組。必須是一維的。
bins:標量序列:定義允許非均勻寬度的 bin 邊緣。
labels:指定返回的 bin 的標籤。必須與上面的 bins 參數長度相同。
include_lowest: (bool) 第一個區間是否應該是左包含的。
bins=[0,50,80,100]labels=['C','B','A']df['grade']=pd.cut(x=df['score'],bins=bins,labels=labels,include_lowest=True)

這樣就創建一個包含 bin 邊界值的 bins 列表和一個包含相應 bin 標籤的標籤列表。

查看每個區段的人數

df.grade.value_counts()C 488B 310A 202Name: grade, dtype: int64

結果與上面示例相同。

3、qcut

qcut可以根據排名或基於樣本分位數將變量離散為大小相等的桶[3]。

在前面的示例中,我們為每個級別定義了分數間隔,這回使每個級別的學生數量不均勻。在下面的示例中,我們將嘗試將學生分類為 3 個具有相等(大約)數量的分數等級。示例中有 1000 名學生,因此每個分箱應該有大約 333 名學生。

qcut參數:

x:要分箱的輸入數組。必須是一維的。
q:分位數。10 表示十分位數,4 表示四分位數等。也可以是交替排列的分位數,例如[0, .25, .5, .75, 1.] 四分位數。
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 設置為 True 則會返回 bin 邊界。

print(cut_bin)>>[0.36.68.100.]

分數間隔如下:

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

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

df.grade.value_counts()C 340A 331B 329Name: grade, dtype: int644、value_counts

雖然 pandas .value_counts 通常用於計算系列中唯一值的數量,但它也可用於使用 bins 參數將值分組到半開箱中。

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

默認情況下, .value_counts 按值的降序對返回的系列進行排序。將 sort 設置為 False 以按其索引的升序對系列進行排序。

(-0.101, 33.333] 310(33.333, 66.667] 340(66.667, 100.0] 350Name: score, dtype: int64

series 索引是指每個 bin 的區間範圍,其中方括號 [ 和圓括號 ) 分別表示邊界值是包含的和不包含的。返回series 的值表示每個 bin 中有多少條記錄。

與 .qcut 不同,每個 bin 中的記錄數不一定相同(大約)。.value_counts 不會將相同數量的記錄分配到相同的類別中,而是根據最高和最低分數將分數範圍分成 3 個相等的部分。分數的最小值為 0,最大值為 100,因此這 3 個部分中的每一個都大約在 33.33 範圍內。這也解釋了為什麼 bin 的邊界是 33.33 的倍數。

我們還可以通過傳入邊界列表來定義 bin 邊界。

df['score'].value_counts(bins=[0,50,80,100],sort=False)(-0.001, 50.0] 488(50.0, 80.0] 310(80.0, 100.0] 202Name: score, dtype: int64

這給了我們與示例 1 和 2 相同的結果。

總結

在本文中,介紹了如何使用 .between、.cut、.qcut 和 .value_counts 對連續值進行分箱。這裡是本文的源代碼:

[1]

來源:https://colab.research.google.com/drive/1yWTl2OzOnxG0jCdmeIN8nV1MoX3KQQ_1%3Fusp%3Dsharing

長按或掃描下方二維碼,後台回覆:加群,即可申請入群。一定要備註:來源+研究方向+學校/公司,否則不拉入群中,見諒!

(長按三秒,進入後台)

推薦閱讀

利用Python做一個漂亮小姐姐詞雲跳舞視頻
30 個Python代碼實現的常用功能,精心整理版
神器!三行 Python 代碼輕鬆提取 PDF 表格數據
四款可視化工具,解決99%的可視化大屏需求
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()