首頁 > 軟體

python中pd.cut()與pd.qcut()的對比及範例

2022-06-16 14:02:07

1、pd.cut()

用於將資料值按照值本身進行分段並排序到 bins 中。
引數包含:x, bins, right, include_lowest, labels, retbins, precision

x :被劃分的陣列
bins :被劃分的區間/區間數

  • - ① 當 bins 為整數時,表示陣列 x 被劃分為多少個等間距的區間;
  • - ② 當 bins 為序列時,表示陣列 x 將被劃分在該指定序列中,若不在則輸出 NaN;
# x = [1,2,3,5,3,4,1],  bins = 3
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3)  
[Out] [(0.996, 2.333], (0.996, 2.333], (2.333, 3.667], (3.667, 5.0], (2.333, 3.667], (3.667, 5.0], (0.996, 2.333]]
      Categories (3, interval[float64]): [(0.996, 2.333] < (2.333, 3.667] < (3.667, 5.0]]

# x = [1,2,3,5,3,4,1],  bins = [1,2,3]
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),[1,2,3])
[Out] [NaN, (1.0, 2.0], (2.0, 3.0], NaN, (2.0, 3.0], NaN, NaN]
      Categories (2, interval[int64]): [(1, 2] < (2, 3]]

right :是否包含右端點,預設為 True;
include_lowest :是否包含左端點,預設為 False;

# x = [1,2,3,5,3,4,1],  bins = [1,2,3], 預設不包含左端點 1,預設包含右端點 3
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),[1,2,3])
[Out] [NaN, (1.0, 2.0], (2.0, 3.0], NaN, (2.0, 3.0], NaN, NaN]
      Categories (2, interval[int64]): [(1, 2] < (2, 3]]

# x = [1,2,3,5,3,4,1],  bins = [1,2,3], 設定包含左端點 1,設定包含右端點 3
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),[1,2,3],include_lowest=True,right=False)
[Out] [[1.0, 2.0), [2.0, 3.0), NaN, NaN, NaN, NaN, [1.0, 2.0)]
      Categories (2, interval[int64]): [[1, 2) < [2, 3)]

labels :是否用標記來替代返回的 bins,預設為 False,如需標記,標記數需與 bins 數一致,併為 labels 賦值一組列表;

# x = [1,2,3,5,3,4,1],  bins = 3, 設定用指定標籤 ['A','B','C'] 返回序列
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3,labels=['A','B','C'])
[Out] [A, A, B, C, B, C, A]
      Categories (3, object): [A < B < C]

retbins : 是否返回間距 bins,預設為 False,僅返回 x 中每個值對應的 bin 的列表,若 retbins = True,則返回 bin 的列表及對應的 bins。

# x = [1,2,3,5,3,4,1],  bins = 3, 設定一併返回對應 bins 序列
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3,retbins=True)
[Out] ([(0.996, 2.333], (0.996, 2.333], (2.333, 3.667], (3.667, 5.0], (2.333, 3.667], (3.667, 5.0], (0.996, 2.333]]
      Categories (3, interval[float64]): [(0.996, 2.333] < (2.333, 3.667] < (3.667, 5.0]],
      array([0.996     , 2.33333333, 3.66666667, 5.        ]))

precision : 精度,區間邊界值保留的小數點位數

# x = [1,2,3,5,3,4,1],  bins = 3, 精度為2
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3,precision=2)
[Out] [(1.0, 2.33], (1.0, 2.33], (2.33, 3.67], (3.67, 5.0], (2.33, 3.67], (3.67, 5.0], (1.0, 2.33]]
      Categories (3, interval[float64]): [(1.0, 2.33] < (2.33, 3.67] < (3.67, 5.0]]

2、pd.qcut()

基於分位數的離散化功能。 根據等級或基於樣本分位數(或者說基於樣本值落在區間的頻率),將變數分離為相等大小的桶。

引數包含:x, q, labels, retbins, precision, duplicates

  • x、labels、retbins、precision 與 pd.cut() 中引數用法一致;
  • q : 將序列 x 劃分為 q 個區間,使落在每個區間的值的數量一致;
  • duplicates :重複值處理,預設為 duplicates = ‘raise’,表示不忽略重複值。如需忽略 x 中的重複值,可指定 duplicates = ‘drop’。

3、pd.cut() v.s. pd.qcut()

  • pd.cut() 將指定序列 x,按指定數量等間距的劃分(根據值本身而不是這些值的頻率選擇均勻分佈的bins),或按照指定間距劃分
  • pd.qcut() 將指定序列 x,劃分為 q 個區間,使落在每個區間的記錄數一致
[In] ll = [1,2,3,5,3,4,1,2]
     print('- - - pd.cut()範例1 - - -')
     print(pd.cut(ll, 4, precision=2).value_counts())
     print('- - - pd.cut()範例2 - - -')
     print(pd.cut(ll, [1,2,4], precision=2).value_counts())
     print('- - - pd.qcut()範例 - - -')
     print(pd.qcut(ll, 4, precision=2).value_counts())

[Out] - - - pd.cut()範例1 - - -
     (1.0, 2.0]    4
     (2.0, 3.0]    2
     (3.0, 4.0]    1
     (4.0, 5.0]    1
     dtype: int64
     - - - pd.cut()範例2 - - -
     (1, 2]    2
     (2, 4]    3
     dtype: int64
     - - - pd.qcut()範例 - - -
     (0.99, 1.75]    2
     (1.75, 2.5]     2
     (2.5, 3.25]     2
     (3.25, 5.0]     2
     dtype: int64

到此這篇關於python中pd.cut()與pd.qcut()的對比及範例的文章就介紹到這了,更多相關python pd.cut()與pd.qcut()內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com