在機械學習中,我們經常會對數據進行分箱處理的操作, 也就是 把一段連續的值切分成若干段,每一段的值看成一個分類。這個把連續值轉換成離散值的過程,我們叫做分箱處理。
比如,把年齡按15歲划分成一組,0-15歲叫做少年,16-30歲叫做青年,31-45歲叫做壯年。在這個過程中,我們把連續的年齡分成了三個類別,"少年","青年"和"壯年"就是各個類別的名稱,或者叫做標簽。
cut和qcut函數的基本介紹
在pandas中,cut和qcut函數都可以進行分箱處理操作。其中cut函數是按照數據的值進行分割,而qcut函數則是根據數據本身的數量來對數據進行分割。
一、pandas.cut
1 函數介紹
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
參數:
1. x,類array對象,且必須為一維,待切割的原形式
2. bins, 整數、序列尺度、或間隔索引。如果bins是一個整數,它定義了x寬度范圍內的等寬面元數量,但是在這種情況下,x的范圍在每個邊上被延長1%,以保證包括x的最小值或最大值。如果bin是序列,它定義了允許非均勻bin寬度的bin邊緣。在這種情況下沒有x的范圍的擴展。
3. right,布爾值。是否是左開右閉區間
4. labels,用作結果箱的標簽。必須與結果箱相同長度。如果FALSE,只返回整數指標面元。
5. retbins,布爾值。是否返回面元
6. precision,整數。返回面元的小數點幾位
7. include_lowest,布爾值。第一個區間的左端點是否包含
返回值:
若labels為False則返回整數填充的Categorical或數組或Series
若retbins為True還返回用浮點數填充的N維數組
2 實例
import pandas as pd
年份 = [1992, 1983, 1922, 1932, 1973] # 待分箱數據
箱子 = [1900, 1950, 2000] # 指定箱子的分界點
結果 = pd.cut(年份, 箱子)
print(結果)
# 結果說明:其中(1950, 2000]說明【年份】列表的第一個值1992位於(1950, 2000]區間
print(pd.value_counts(結果)) # 對不同箱子中的數進行計數
# labels參數為False時,返回結果中用不同的整數作為箱子的指示符
結果2 = pd.cut(年份, 箱子,labels=False)
# 輸出結果中的數字對應着不同的箱子
print(結果2)
# 結果說明:其中 1 說明【年份】列表的第一個值1992位於(1950, 2000]區間
# 其中 0 說明【年份】列表的第一個值1922位於(1900, 1950]區間
print(pd.value_counts(result2)) # 對不同箱子中的數進行計數
import pandas as pd
年份 = [1992, 1983, 1922, 1932, 1973] # 待分箱數據
箱子 = [1900, 1950, 2000] # 指定箱子的分界點
# 可以將想要指定給不同箱子的標簽傳遞給labels參數
箱子名稱 = [ '50年代前', '50年代后']
結果3 = pd.cut(年份, 箱子, labels=箱子名稱)
print(pd.value_counts(結果3))
二、pandas.qcut
1 理論
pandas.qcut 和上面基本相同,只是q分箱需要自己設置。可以指定箱子的數量對連續數據進行等寬分箱處理(注意:所謂等寬指的是每個箱子中的數據量是相同的)
pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
2 實例
import pandas as pd
年份 = [1992, 1983, 1922, 1932, 1973, 1999, 1993, 1995] # 待分箱數據
結果 = pd.qcut(年份,q=4) # 參數q指定所分箱子的數量
# 從輸出結果可以看到每個箱子中的數據量時相同的
print(結果)
print(pd.value_counts(結果)) # 從輸出結果可以看到每個箱子中的數據量時相同的