Pandas對數(shù)值進行分箱操作的4種方法總結(jié)
前言
使用 Pandas 的between 、cut、qcut 和 value_count離散化數(shù)值變量。
分箱是一種常見的數(shù)據(jù)預(yù)處理技術(shù)有時也被稱為分桶或離散化,他可用于將連續(xù)數(shù)據(jù)的間隔分組到“箱”或“桶”中。在本文中,我們將討論使用 python Pandas 庫對數(shù)值進行分箱的 4 種方法。
我們創(chuàng)建以下合成數(shù)據(jù)用于演示
import?pandas?as?pd?#?version?1.3.5?
import?numpy?as?np?
def?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 之間。
參數(shù)有下面三個:
- left:左邊界
- right:右邊界
- inclusive:要包括哪個邊界??山邮艿闹禐?{“both”、“neither”、“left”、“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()
C 488
B 310
A 202
Name: grade, dtype: int64
此方法需要為每個 bin 編寫處理的代碼,因此它僅適用于 bin 很少的情況。
2、cut
可以使用 cut將值分類為離散的間隔。此函數(shù)對于從連續(xù)變量到分類變量也很有用。
cut的參數(shù)如下:
- x:要分箱的數(shù)組。必須是一維的。
- bins:標(biāo)量序列:定義允許非均勻?qū)挾鹊?bin 邊緣。
- labels:指定返回的 bin 的標(biāo)簽。必須與上面的 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 標(biāo)簽的標(biāo)簽列表。

查看每個區(qū)段的人數(shù)
df.grade.value_counts()
C 488
B 310
A 202
Name: grade, dtype: int64
結(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 的標(biāo)簽。必須與生成的 bin 長度相同。
- retbins: (bool) 是否返回 (bins, labels)。
df['grade'],?cut_bin?=?pd.qcut(df['score'],? ??????????????????????????q?=?3,? ??????????????????????????labels?=?['C',?'B',?'A'],? ??????????????????????????retbins?=?True)? df.head()

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()
C 340
A 331
B 329
Name: grade, dtype: int64
4、value_counts
雖然 pandas .value_counts 通常用于計算系列中唯一值的數(shù)量,但它也可用于使用 bins 參數(shù)將值分組到半開箱中。
df['score'].value_counts(bins?=?3,?sort?=?False)
默認情況下, .value_counts 按值的降序?qū)Ψ祷氐南盗羞M行排序。將 sort 設(shè)置為 False 以按其索引的升序?qū)ο盗羞M行排序。
(-0.101, 33.333] 310 (33.333, 66.667] 340 (66.667, 100.0] 350 Name: score, dtype: int64
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)
(-0.001, 50.0] 488
(50.0, 80.0] 310
(80.0, 100.0] 202
Name: score, dtype: int64
這給了我們與示例 1 和 2 相同的結(jié)果。
以上就是Pandas對數(shù)值進行分箱操作的4種方法總結(jié)的詳細內(nèi)容,更多關(guān)于Pandas數(shù)值分箱的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch中model.train()和model.eval()用法及說明
在PyTorch中,model.train()用于啟用BatchNormalization和Dropout,保證模型在訓(xùn)練階段能夠有效地利用這些層的特性,而model.eval()則是用于測試階段,確保BatchNormalization和Dropout不會影響測試結(jié)果,保持模型的穩(wěn)定性2024-09-09
Python標(biāo)準(zhǔn)庫re的使用舉例(正則化匹配)
正則表達式re是內(nèi)置函數(shù),通過一定的匹配規(guī)則獲取指定的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Python標(biāo)準(zhǔn)庫re的使用舉例,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-10-10
python 3利用BeautifulSoup抓取div標(biāo)簽的方法示例
這篇文章主要介紹了python 3利用BeautifulSoup抓取div標(biāo)簽的方法,文中給出了詳細的示例代碼供大家參考學(xué)習(xí),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05
Python?不設(shè)計?do-while?循環(huán)結(jié)構(gòu)的理由
Python作為一種語言不支持do-while循環(huán)。?但是,我們可以采用一種變通方法來模擬do-while循環(huán)?。下面通過本文給大家分享下Python?不設(shè)計do-while?循環(huán)結(jié)構(gòu)的理由,需要的朋友可以參考下2022-01-01
python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能
一款跨平臺/無依賴的自動化測試工具,目測只能控制鼠標(biāo)/鍵盤/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能,需要的朋友可以參考下2019-08-08

