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()的區別。