https://www.cnblogs.com/sench/p/10128216.html
pandas.cut用來把一組資料分割成離散的區間,比如有一組年齡資料,可以使用pandas.cut將年齡資料分割成不同的年齡段并打上標簽,
原型
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise') #0.23.4
引數含義
x:被切分的類陣列(array-like)資料,必須是1維的(不能用DataFrame);bins:bins是被切割后的區間(或者叫“桶”、“箱”、“面元”),有3中形式:一個int型的標量、標量序列(陣列)或者pandas.IntervalIndex ,
- 一個int型的標量
當bins為一個int型的標量時,代表將x平分成bins份,x的范圍在每側擴展0.1%,以包括x的最大值和最小值, - 標量序列
標量序列定義了被分割后每一個bin的區間邊緣,此時x沒有擴展, - pandas.IntervalIndex
定義要使用的精確區間,
right:bool型引數,默認為True,表示是否包含區間右部,比如如果bins=[1,2,3],right=True,則區間為(1,2],(2,3];right=False,則區間為(1,2),(2,3),labels:給分割后的bins打標簽,比如把年齡x分割成年齡段bins后,可以給年齡段打上諸如青年、中年的標簽,labels的長度必須和劃分后的區間長度相等,比如bins=[1,2,3],劃分后有2個區間(1,2],(2,3],則labels的長度必須為2,如果指定labels=False,則回傳x中的資料在第幾個bin中(從0開始),retbins:bool型的引數,表示是否將分割后的bins回傳,當bins為一個int型的標量時比較有用,這樣可以得到劃分后的區間,默認為False,precision:保留區間小數點的位數,默認為3.include_lowest:bool型的引數,表示區間的左邊是開還是閉的,默認為false,也就是不包含區間左部(閉),duplicates:是否允許重復區間,有兩種選擇:raise:不允許,drop:允許,
回傳值
out:一個pandas.Categorical, Series或者ndarray型別的值,代表磁區后x中的每個值在哪個bin(區間)中,如果指定了labels,則回傳對應的label,bins:分隔后的區間,當指定retbins為True時回傳,
例子
這里拿給年齡分組當做例子,
import numpy as np
import pandas as pd
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年齡資料
將ages平分成5個區間
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32])
pd.cut(ages, 5)
輸出:
[(0.901, 20.8], (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], ..., (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], (20.8, 40.6]]
Length: 16
Categories (5, interval[float64]): [(0.901, 20.8] < (20.8, 40.6] < (40.6, 60.4] < (60.4, 80.2] < (80.2, 100.0]]
可以看到ages被平分成5個區間,且區間兩邊都有擴展以包含最大值和最小值,
將ages平分成5個區間并指定labels
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年齡資料
pd.cut(ages, 5, labels=[u"嬰兒",u"青年",u"中年",u"壯年",u"老年"])
輸出:
[嬰兒, 嬰兒, 嬰兒, 青年, 青年, ..., 嬰兒, 嬰兒, 青年, 青年, 青年]
Length: 16
Categories (5, object): [嬰兒 < 青年 < 中年 < 壯年 < 老年]
給ages指定區間進行分割
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年齡資料
pd.cut(ages, [0,5,20,30,50,100], labels=[u"嬰兒",u"青年",u"中年",u"壯年",u"老年"])
輸出:
[嬰兒, 嬰兒, 青年, 壯年, 壯年, ..., 青年, 青年, 中年, 中年, 壯年]
Length: 16
Categories (5, object): [嬰兒 < 青年 < 中年 < 壯年 < 老年]
這里不再平分ages,而是將ages分為了5個區間(0, 5],(5, 20],(20, 30],(30,50],(50,100].
回傳分割后的bins
令retbins=True即可
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年齡資料
pd.cut(ages, [0,5,20,30,50,100], labels=[u"嬰兒",u"青年",u"中年",u"壯年",u"老年"],retbins=True)
輸出:
([嬰兒, 嬰兒, 青年, 壯年, 壯年, ..., 青年, 青年, 中年, 中年, 壯年]
Length: 16
Categories (5, object): [嬰兒 < 青年 < 中年 < 壯年 < 老年],
array([ 0, 5, 20, 30, 50, 100]))
只回傳x中的資料在哪個bin
令labels=False即可
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年齡資料
pd.cut(ages, [0,5,20,30,50,100], labels=False)
輸出:
array([0, 0, 1, 3, 3, 1, 4, 4, 4, 4, 4, 1, 1, 2, 2, 3], dtype=int64)
第一個0表示1在第0個bin
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141675.html
標籤:Python
下一篇:學習第41天
