pandas 的pd.cut() 和pd.qcut() 數據分箱


pd.cut()

是把一組數據按照一定bins分割成離散的區間,得到的數據是每個值的落到的區間,此函數對於從連續變量轉換為離散變量也很有用

#參數如下:
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')

參數解釋:

1 x:被分割的數組數據,可以是df[col],np.array,還可以是pd.seres,list 但是數據必須是一維的 2 bins:被分割后的區間,有三種形式,int值(如bins=5,就是將x平均分為5位),list或者np.array(如bins=[1,2,3],則將x按照(1,2],(2,3]分割),pandas.IntervalIndex 定義要使用的精確區間
3 right:bool型參數,默認為True,表示是否包含區間右部
4 labels:給分割后的區間打標簽,但是labels的長度必須和分割后的區間的長度相等 5 retbins:bool型的參數,表示是否將分割后的bins返回
6 precision:保留區間小數點的位數,默認為3
7 include_lowest:bool型的參數,表示區間的左邊是開還是閉的,默認為false,也就是不包含區間左部(閉)
8 duplicates:是否允許重復區間

返回值:

分割后每個值落在的區間

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()

a=np.arange(1,100)  #np.array
b=[i for i in range(1,100)]  #list
df=pd.DataFrame(iris.data,columns=iris.feature_names)  #df
ser=pd.Series(a)  #series
tp=tuple(a)  #tuple

pd.cut(a,5)
pd.cut(b,5)
pd.cut(df['sepal length (cm)'],5)
pd.cut(ser,5)
pd.cut(tp,5)

運用各種參數

#平均分為5分
pd.cut(a,5)

#按照給定區間划分
pd.cut(a,bins=[0,10,20,40,60,100])

#指定labels
pd.cut(a,bins=[0,10,20,40,60,100],labels=["嬰兒","青年","中年","壯年","老年"])

#返回分割后的bins
pd.cut(a,bins=[0,10,20,40,60,100],labels=["嬰兒","青年","中年","壯年","老年"],retbins=True)

#返回x中的數據位於第幾個bin
pd.cut(a,bins=[0,10,20,40,60,100],labels=False)

 

qcut

qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
基於分位數的離散化功能。 根據等級或基於樣本分位數將變量分離為相等大小的桶。 例如,10個分位數的1000個值將產生一個分類對象,表示每個數據點的分位數成員資格。
import numpy as np
import pandas as pd
a=np.random.randn(30)
pd.cut(a,5).value_counts()
pd.qcut(a,5).value_counts()

'''
pd.cut(a,5).value_counts()
Out[674]: 
(-1.145, -0.374]    10
(-0.374, 0.392]      8
(0.392, 1.159]       7
(1.159, 1.926]       4
(1.926, 2.692]       1
dtype: int64

pd.qcut(a,5).value_counts()
Out[675]: 
(-1.142, -0.692]    6
(-0.692, -0.249]    6
(-0.249, 0.39]      6
(0.39, 0.912]       6
(0.912, 2.692]      6
dtype: int64

'''

首先是觀察上面的數據, 先分析qcut()函數:qcut(factors, 5),當你用qcut求五分之一時,將選擇這些規則選擇bins:使你在每個bins里有相同數量的記錄。 你有30個記錄,所以每個bin應該有6個(你的輸出應該是這樣的,盡管斷點會因隨機抽取而不同).這樣就是結果中每個分組里面均有6個數存在的原因。 cut()函數:因為cut()會根據值本身而不是這些值的頻率選擇均勻分布的bins(在本例中直接將bins分成5份)。 因此,因為隨機生成一個正態分布數據,你會看到靠近均值bins中的頻率更高,外部更少。 這基本上是一個直方圖的表格形式。 從上面的分析即可得出qcut()和cut()的區別。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM