https://www.cnblogs.com/nicetoseeyou/p/10655422.html
pandas之cut(),qcut()
功能:將數據進行離散化
可參見博客:https://blog.csdn.net/missyougoon/article/details/83986511 , 例子簡易好懂
1、pd.cut函數有7個參數,主要用於對數據從最大值到最小值進行等距划分
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
參數:
x : 輸入待cut的一維數組
bins : cut的段數,一般為整型,但也可以為序列向量(若不在該序列中,則是NaN)。
right : 布爾值,確定右區間是否開閉,取True時右區間閉合
labels : 數組或布爾值,默認為None,用來標識分后的bins,長度必須與結果bins相等,返回值為整數或者對bins的標識
retbins : 布爾值,可選。是否返回數值所在分組,Ture則返回
precision : 整型,bins小數精度,也就是數據以幾位小數顯示
include_lowest : 布爾類型,是否包含左區間

cut將根據值本身來選擇箱子均勻間隔,即每個箱子的間距都是相同的。
>>> factors = np.random.randn(9) [ 2.12046097 0.24486218 1.64494175 -0.27307614 -2.11238291 2.15422205 -0.46832859 0.16444572 1.52536248]
傳入bins參數
>>> pd.cut(factors, 3) #返回每個數對應的分組 [(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]] Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]] >>> pd.cut(factors, bins=[-3,-2,-1,0,1,2,3]) [(2, 3], (0, 1], (1, 2], (-1, 0], (-3, -2], (2, 3], (-1, 0], (0, 1], (1, 2]] Categories (6, interval[int64]): [(-3, -2] < (-2, -1] < (-1, 0] < (0, 1] (1, 2] < (2, 3]] >>> pd.cut(factors, 3).value_counts() #計算每個分組中含有的數的數量 Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]] (-2.117, -0.69] 1 (-0.69, 0.732] 4 (0.732, 2.154] 4
傳入lable參數
>>> pd.cut(factors, 3,labels=["a","b","c"]) #返回每個數對應的分組,但分組名稱由label指示 [c, b, c, b, a, c, b, b, c] Categories (3, object): [a < b < c] >>> pd.cut(factors, 3,labels=False) #返回每個數對應的分組,但僅顯示分組下標 [2 1 2 1 0 2 1 1 2]
傳入retbins參數
>>> pd.cut(factors, 3,retbins=True)# 返回每個數對應的分組,且額外返回bins,即每個邊界值 ([(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]] Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]], array([-2.11664951, -0.69018126, 0.7320204 , 2.15422205]))
2、pd.qcut函數,按照數據出現頻率百分比划分,比如要把數據分為四份,則四段分別是數據的0-25%,25%-50%,50%-75%,75%-100%,每個間隔段里的元素個數都是相同的。
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise') #最后一個參數 duplicates='drop'表示若有重復區間則刪除

qcut是根據這些值的頻率來選擇箱子的均勻間隔,即每個箱子中含有的數的數量是相同的。
傳入q參數
>>> pd.qcut(factors, 3) #返回每個數對應的分組 [(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]] Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154]] >>> pd.qcut(factors, 3).value_counts() #計算每個分組中含有的數的數量 (-2.113, -0.158] 3 (-0.158, 1.525] 3 (1.525, 2.154] 3
傳入lable參數
>>> pd.qcut(factors, 3,labels=["a","b","c"]) #返回每個數對應的分組,但分組名稱由label指示 [c, b, c, a, a, c, a, b, b] Categories (3, object): [a < b < c] >>> pd.qcut(factors, 3,labels=False) #返回每個數對應的分組,但僅顯示分組下標 [2 1 2 0 0 2 0 1 1]
傳入retbins參數
>>> pd.qcut(factors, 3,retbins=True)# 返回每個數對應的分組,且額外返回bins,即每個邊界值 [(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]] Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154],array([-2.113, -0.158 , 1.525, 2.154]))
另一個例子:
import numpy as np from numpy import * import pandas as pd df = pd.DataFrame() df['data'] = [1,2,2,2,2,6,7,8,9,0]#這里注意箱邊界值需要唯一,不然qcut時程序會報錯 df['cut']=pd.cut(df['data'],5) df['qcut']=pd.qcut(df['data'],5) df.head(10)
運行結果如圖:
可以看到cut列各個分段之間間距相等,qcut由於數據中‘2’較多,所以2附近間距較小,2之后的分段間距較大。