1. 程式人生 > >pandas 學習彙總11 - 統計:pd.cut與pd.qcut數字按區間劃分( tcy)

pandas 學習彙總11 - 統計:pd.cut與pd.qcut數字按區間劃分( tcy)

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