pandas 學習彙總11 - 統計:pd.cut與pd.qcut數字按區間劃分( tcy)
阿新 • • 發佈:2018-12-15
pd.cut與pd.qcut數字按區間劃分 2018/12/4
1.函式:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False) 用途:返回 x 中的每一個數據 在bins 中對應 的範圍 引數: # x : 必須是一維資料 # bins: 不同面元(不同範圍)型別:整數,序列如陣列, 和IntervalIndex # right: 最後一個bins是否包含最右邊的資料,預設為True # precision:精度 預設保留三位小數 # retbins: 即return bins 是否返回每一個bins的範圍 預設為False pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=’raise’) 用途:基於樣本分位數劃分資料。即把一組數字按大小區間進行分割槽 引數: # x:是資料 1d ndarray或Series # q:整數或分位數陣列;定義區間分割方法 # 分位數10為十分位數,4為四分位數等。或分位陣列,如四分位數 [0, 0.25, 0.5, 0.75, 1] 分成兩半[0, 0.5, 1]
注意:有幾個區間,就要給幾個值,不能多也不能少.
2.1.cut例項
ages = [18,22,25,27,21,23,37,31,61,90] # 例項1:bins 序列:允許類別範圍可不同 邊際不擴充套件 如18不屬於第一個面元 cats1=pd.cut(ages,bins=[18,25,35,60,90]) cats1 # # [NaN, (18, 25], (18, 25], (25, 35], (18, 25], (18, 25], (35, 60], (25, 35], (60, 90], (60, 90]] # Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 90]] cats1.value_counts() # (18, 25] 4 # (25, 35] 2 # (35, 60] 1 # (60, 90] 2 # dtype: int64
# 例項2:bins 整數:返回等寬的面元 範圍擴大千分之一
cats2=pd.cut(ages,bins=6) cats2 # # [(17.928, 30.0], (17.928, 30.0], (17.928, 30.0], (17.928, 30.0], (17.928, 30.0], # (17.928, 30.0], (30.0, 42.0], (30.0, 42.0], (54.0, 66.0], (78.0, 90.0]] # Categories (6, interval[float64]): # [(17.928, 30.0] < (30.0, 42.0] < (42.0, 54.0] < (54.0, 66.0] < (66.0, 78.0] < (78.0, 90.0]] cats2.value_counts() # (17.928, 30.0] 6 # (30.0, 42.0] 2 # (42.0, 54.0] 0 # (54.0, 66.0] 1 # (66.0, 78.0] 0 # (78.0, 90.0] 1 # dtype: int64
# 例項3: bins 是IntervalIndex 沒有包含的資料會被設定為NaN
bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])
v1=pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)
# [NaN, (0, 1], NaN, (2, 3], (4, 5]]
# Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]]
v1.value_counts()
# (0, 1] 1
# (2, 3] 1
# (4, 5] 1
# dtype: int64
# 例項4:labels : 可以為每一個bins新增一個標籤
v1=pd.cut(np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]),3, labels=["good", "medium", "bad"])
# [good, good, good, medium, bad, good]
# Categories (3, object): [good < medium < bad]
v1.categories.value_counts()
# medium 1
# good 1
# bad 1
# dtype: int64
2.2.qcut例項
data = pd.Series([0,8,1,5,3,7,2,6,10,4,9])
# 例項1:把這組資料分成兩部分,一半大的,一半小的,如是小的數值變成'小',大的數值變成'大':
v=pd.qcut(data,[0,0.5,1],labels=['大','小'],duplicates='drop')#若有重複區間刪除
# 0 大
# 1 小
# 2 大
# 3 大
# 4 大
# 5 小
# 6 大
# 7 小
# 8 小
# 9 大
# 10 小
# dtype: category
# Categories (2, object): [大 < 小]
v.value_counts()
# 大 6
# 小 5
# dtype: int64
例項2:
v=pd.qcut(data,[0, 0.1, 0.2, 0.3, 1],labels=['s1','s2','s3','s4'],retbins=True)#retbins=True輸出元祖
# (0 s1
# 1 s4
# 2 s1
# 3 s4
# 4 s3
# 5 s4
# 6 s2
# 7 s4
# 8 s4
# 9 s4
# 10 s4
# dtype: category
# Categories (4, object): [s1 < s2 < s3 < s4],
# array([ 0, 1, 2, 3, 10], dtype=int64))
v[0].value_counts()
# s4 7
# s1 2
# s3 1
# s2 1
# dtype: int64