pandas 學習 第10篇:離散化和切分


在數據分析中,通常需要把連續的數據離散化或拆分成多個區間(bin),這就需要用到cut()或qcut()函數。

一,cut函數

把值切分成離散的區間,有三種切分方式,第一種方式是制定區間的數量,把連續值平均切分;第二種方式是以標量值序列指定各個區間的邊界值;第三種方式是以IntervalIndex 精確指定各個區間,區間之間不允許重疊。

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)

參數注釋:

  • x:array-like
  • bins:如果是整數,表示切分區間的數量;如果是整數序列(從小到大),表示通過元素指定各個區間的邊界;如果是IntervalIndex,表示精確指定各個區間。
  • right:是否包含區間的右邊界
  • labels:為每一個區間指定一個標簽
  • retbins:是否返回bins(切分的區間的邊界)
  • precision:指定區間標簽(bin label)的精度,通常是對浮點數標簽來說,指定小數點后的位數
  • include_lowest:指定第一個區間是否包含最低值

cut函數返回的是Categorical的對象,這是一個array-like對象,表示每一個x元素所在的區間。

1,Categorical類型

Categorical類型是指對list-like對象進行分類,返回值包括兩部分,第一部分是列表,表示對原始list-like中各個元素進行分類之后的類標簽,第二部分是類別信息。

舉個例子,返回值第一部分是一個列表,元素是1,2,3表示各個分類。第二部分是Categories信息,共分為3類,類標簽的類型是int64,類別(bins)是[1,2,3]。

>>> pd.Categorical([1, 2, 3, 1, 2, 3])
[1, 2, 3, 1, 2, 3]
Categories (3, int64): [1, 2, 3]

2,指定切分區間的數量

把ages列表平均划分為4個區間,返回的結果中,第一部分是區間的標簽,這是由左開右閉的區間構成的列表;第二部分是元素的數量(Length),第三部分是分類信息,有4個分類,最后返回bins數組。

>>> ages=[20,22,25,27,21,23,37,31,61,45,41,32]
>>> cats=pd.cut(x=ages,bins=4,precision =0,retbins=True)
>>> cats
([(20.0, 30.0], (20.0, 30.0], (20.0, 30.0], (20.0, 30.0], (20.0, 30.0], ..., (30.0, 40.0], (51.0, 61.0], (40.0, 51.0], (40.0, 51.0], (30.0, 40.0]]
Length: 12
Categories (4, interval[float64]): [(20.0, 30.0] < (30.0, 40.0] < (40.0, 51.0] < (51.0, 61.0]], array([19.959, 30.25 , 40.5 , 50.75 , 61. ]))

2,指定切分區間的邊界

對ages列表進行划分,區間的邊界由bins列表來指定

>>> ages=[20,22,25,27,21,23,37,31,61,45,41,32]
>>> bins=[18,25,35,60,100]
>>> cats = pd.cut(ages,bins,right=True)
>>> cats
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
>>> 

3,指定區分的區間

 通過from_breaks()函數來制定IntervalIndex,精確制定區間的邊界,用於對連續的數據進行切分:

>>> ages = [20,22,25,27,21,23,37,31,61,45,41,32]
>>> breaks = pd.IntervalIndex.from_breaks([18,25,35,60,100])
>>> breaks
IntervalIndex([(18, 25], (25, 35], (35, 60], (60, 100]],
              closed='right',
              dtype='interval[int64]')
>>> pd.cut(x=ages,bins=breaks)
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]

二,qcut函數

qcut()函數也是用於切分的函數,q是Quantile(分位數)的意思,基於分位數對連續數據進行切分。基於排序或分位數,把變量分散到大小相等的桶(bucket)中。

例如,10個分位數的1000個值將產生一個分類對象,指示每個數據點的分位數隸屬關系。

For example 1000 values for 10 quantiles would produce a Categorical object indicating quantile membership for each data point.

pandas.qcut(x, q, labels=None, retbins=False, precision=3)

參數注釋:

  • x:一維數組,或序列
  • q:分位數的個數(10是指10分位數,4是指4分位數),或者制定分位數的序列

舉個例子,指定分位數的序列,q=[0,0.2,0.9,1] 表示把從(0, 0.2]的分位數作為一個區間,把(0.2, 0.9]的分位數作為一個區間,把(0.9,1]的分位數作為一個區間:

>>> ages=[20,22,25,27,21,23,37,31,61,45,41,32]
>>> pd.qcut(x=ages,q=[0,0.5,0.9,1],precision=0)
[(19.0, 29.0], (19.0, 29.0], (19.0, 29.0], (19.0, 29.0], ...,(45.0, 61.0], (29.0, 45.0], (29.0, 45.0]]
Length: 12
Categories (3, interval[float64]): [(19.0, 29.0] < (29.0, 45.0] < (45.0, 61.0]]

 

 

 

參考文檔:

pandas General functions


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM