cut( )用來把一組數據分割成離散的區間。
cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise') # x:被切分的數據,必須是一維的 # bins:①int型整數:將x按照數值大小平均分成分成bins份,x的范圍在最左側和最右側分別擴展0.1%以包括最大值和最小值#②標量序列:自定義分組的每個區間,此時嚴格按照給定的區間分割,x最左和最右不擴展#③pandas.IntervalIndex # right:布爾值,默認為True,表示分割后包含區間右側值不包含左側值,False表示分割后包含左側值不包括右側值 # labels:分組后bins的標簽,默認為None顯示分割后屬于的區間 # retbins:返回結果中是否包括bins,一般bins參數使用整數時 # precision:保留的小數點位數,默認為3 # include_lowest:如果自定義標量序列分組,第一個區間是否包含左側最小值 # duplicates:是否允許區間重復
?
bins設置為整數,將一維數組平均分為5份
arr = np.array([1,77,10,89,36,12,58,62,5,40,32,18,20,25,30,100]) c = pd.cut(arr,5,precision=1) print(c) # [(0.9, 20.8], (60.4, 80.2], (0.9, 20.8], (80.2, 100.0], (20.8, 40.6], ..., (0.9, 20.8], (0.9, 20.8], (20.8, 40.6], (20.8, 40.6], (80.2, 100.0]] # Length: 16 # Categories (5, interval[float64]): [(0.9, 20.8] < (20.8, 40.6] < (40.6, 60.4] < (60.4, 80.2] < (80.2, 100.0]]
系統自動根據數組中數值的大小將原數據平均分為5分,每個區間間隔為19.8。整個區間的起點為(1,100],由于右側包含了100因此最大區間的最大值無需擴展,而由于不包括1,因此最小區間的最小值需向左擴展0.1% * 100 = 0.1,即1-0.1 = 0.9。
設置retbins=True,會將分割區間以數組形式顯示出來,這個參數一般在bins設置為整數時使用,因為其他bins兩種方式都是自定義了這個區間。
arr = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) c = pd.cut(arr,5,precision=1,retbins = True) print(c) # ([(0.9, 20.8], (0.9, 20.8], (0.9, 20.8], (20.8, 40.6], (20.8, 40.6], ..., (0.9, 20.8], (0.9, 20.8], (20.8, 40.6], (20.8, 40.6], (20.8, 40.6]] # Length: 16 # Categories (5, interval[float64]): [(0.9, 20.8] < (20.8, 40.6] < (40.6, 60.4] < (60.4, 80.2] < (80.2, 100.0]], \
# array([ 0.901, 20.8 , 40.6 , 60.4 , 80.2 , 100. ]))
?
bins自定義分組序列,并指定lables
c = pd.cut(arr,bins = [1,5,18,35,50,100],labels = ['幼兒','少年','青年','中年','老年'],precision=1) print(c) # [NaN, 老年, 少年, 老年, 中年, ..., 少年, 青年, 青年, 青年, 老年] # Length: 16 # Categories (5, object): [幼兒 < 少年 < 青年 < 中年 < 老年]
上述示例的意思是,將原數組按照1-5、5-18、18-35、35-50、50-100(左開右閉)的區間進行劃分,劃分后分別對應幼兒、少年、青年、中年、老年。
但是由于默認為左開區間所以無法將最小值劃到一個給定的區間(如果設置right=False則最大值無對應區間),因此原數組中的第一個數1返回的是NaN,可以設置參數include_lowest=True,則可將最小是包含進去。
c = pd.cut(arr,bins = [1,5,18,35,50,100],labels = ['幼兒','少年','青年','中年','老年'],precision=1,include_lowest=True) print(c) # [幼兒, 老年, 少年, 老年, 中年, ..., 少年, 青年, 青年, 青年, 老年] # Length: 16 # Categories (5, object): [幼兒 < 少年 < 青年 < 中年 < 老年]
?
?
上述例子的返回結果包含三項,第一項是每個數屬于哪個區間,第二個是原數組長度,第三個是Category對象
如果只想顯示第一項、即數組中的每個值屬于哪個區間,可設置為labels = False
c= pd.cut(arr,bins = [1,5,18,35,50,100],labels=False,include_lowest=True) print(c) # [0 0 1 3 3 1 4 4 4 4 4 1 2 2 2 2]
?