pandas qcut 和cut 詳解

滄桑之前丶青春之後發表於2020-09-23

在機器學習中,連續變數的離散化過程,一般用pandas的 qcut或者cut函式來進行分箱。
關於這兩個函式的聯絡和區別,網上有各種說法,典型的有以下幾種:

  • qcut用於指定箱子個數,cut用於指定分箱邊界。
  • qcut用於等頻分箱,cut用於等距分箱。
  • qcut用於值比較多的情況,cut用於值比較少。

這些說法都是不準確或者不對的,歸根結底來說,qcut和cut的區別,是分箱思路的不同。也就是分箱時,你關注的是箱子的容量(即箱子中樣本的多少),還是關注箱子的尺寸(即邊界值,以及邊界值之間的距離)。

如果關注的是箱子的容量,比如希望等頻分箱,或者第一個箱子裝50%,剩下的平分,那麼就用qcut。
如果關注的是箱子的尺寸,比如0-100的裝在一個箱子裡面,100-200的裝另外一個,或者說等距分箱,那麼就用cut。

具體解釋下qcut和cut的各個引數以及返回值的含義。

qcut 基於分位數的離散化方法
不僅可以等頻分箱,而且可以指定每個箱子的分位數。

out, bins = pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=‘raise’)

引數名取值說明
x1d ndarray or Series分箱物件陣列
qint or list-like of floatint:分位數,比如10代表按照10分位分箱,4代表按照4分位分箱。
list-like of float:分位數陣列,比如[0, .25, .5, .75, 1.] 必須在0,1之間取值
labelsarray or False, default None分箱的標籤陣列,False的時候返回代表分箱的整數
retbinsbool, optional是否把分箱結果作為返回值。
precisionint, optional精度
duplicates{default ‘raise’, ‘drop’}, optional如果分箱邊界不是唯一的,指定raise ValueError ,或者是drop 非唯一值
返回值取值說明
outCategorical or Series or array of integers if labels is False如果x是series則out是category series,否則out是Categorical
binsndarray of floats分位數陣列,只有retbins 為True才返回

cut 基於箱子長度的離散化方法
不僅可以等距分箱,還可以指定每個箱子的邊界,甚至可以留白

out, bins = pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates=‘raise’, ordered=True)

引數名取值說明
x1d ndarray or Series分箱物件陣列
binsint, sequence of scalars, or IntervalIndexint:指定等距分箱的箱子數量,同時最左或者最右邊界再擴充套件0.1%(取決於right引數)
sequence of scalars:
IntervalIndex:指定分箱間隔值,不在間隔的樣本資料都設為NaN
rightbool, default True分箱是否包括最右側的值
labelsarray or False, default None分箱的標籤陣列,False的時候返回代表分箱的整數
retbinsbool, optional是否把分箱結果作為返回值。
precisionint, optional精度
include_lowestbool, default False第一個分箱是否應該包括最小值
duplicates{default ‘raise’, ‘drop’}, optional如果分箱邊界不是唯一的,指定raise ValueError ,或者是drop 非唯一值
orderedbool, default True返回值out是否被排序
New in version 1.1.0.
返回值取值說明
outCategorical or Series or array of integers if labels is False如果x是series則out是category series,否則out是Categorical
binsndarray of floats分位數陣列,只有retbins 為True才返回

相關文章