利用python將連續指標離散化,離散變量啞元化--pandas中的cut()、qcut()、get_dummies()


       在實際分析中,經常遇到連續值需要離散化,或者離散值需要啞元化的問題,下面將分別舉例說明。

       1、連續指標離散化

       可以根據自己的需求划分不同的區間,然后使用pandas中cut()、qcut()函數來完成連續變量離散化操作。

 1 #導入模塊
 2 import pandas as pd
 3 
 4 # 將范圍划分為(0, 18]、(18, 25]、(25, 35]、(35, 60]、(60, 100]
 5 ages = [10, 21, 24, 25, 32, 23, 22, 42, 35, 66, 21]
 6 bins = [0, 18, 25, 35, 60, 100]
 7 cats = pd.cut(ages, bins, right=True)  #right=False表示區間是左閉右開的
 8   cats
 9   [(0, 18], (18, 25], (18, 25], (18, 25], (25, 35], ..., (18, 25],  
10   (35, 60], (25, 35], (60, 100], (18, 25]]
11   Length: 11
12   Categories (5, interval[int64]): [(0, 18] < (18, 25] < (25, 35] < (35, 60] < (60, 100]]
13 #查看ages中不同值對應的標簽
14 cats.codes
15 array([0, 1, 1, 1, 2, 1, 1, 3, 2, 4, 1], dtype=int8)                                       
16 #對不同區間的數進行統計
17 cats.value_counts()
18   (0, 18]      1
19   (18, 25]     6
20   (25, 35]     2
21   (35, 60]     1
22   (60, 100]    1 
23   dtype: int64 
 1 import numpy as np
 2 
 3 data = np.random.rand(20)
 4 #cut傳入的是區間數量時候,他會根據數據的最小值和最大值計算等長面元
 5 pd.cut(data, 4, precision=2)
 6   [(0.53, 0.76], (0.76, 0.99], (0.068, 0.3], (0.3, 0.53], (0.53, 0.76], ..., (0.76,0.99], (0.76, 0.99], (0.068, 0.3], (0.53, 0.76], (0.068, 0.3]]
 7   Length: 20 
 8   Categories (4, interval[float64]): [(0.068, 0.3] < (0.3, 0.53] < (0.53, 0.76] <(0.76, 0.99]]
 9 
10 #qcut()是pandas中的一個類似於cut的函數,根據樣本分位數對數據進行面元划分
11 data = np.random.rand(1000)
12 cats = pd.qcut(data, 4)   #按四分位數切割
13 cats.value_count()
14   (-0.000589, 0.257]    250
15   (0.257, 0.516]        250
16   (0.516, 0.761]        250
17   (0.761, 0.994]        250
18   dtype: int64
19 
20 #自定義分位數
21 cats = pd.qcut(data, [0, 0.1, 0.5, 0.9, 1.])
22 cats.value_counts()
23   (-0.000589, 0.115]    100
24   (0.115, 0.516]        400
25   (0.516, 0.908]        400
26   (0.908, 0.994]        100
27   dtype: int64

         2、離散指標啞元化

        分類變量啞元化是指將分類變量轉換成“啞變量矩陣”(dummy matrix),如果DataFrame中的某一列中含有k個不同的值,則可以派生出一個k列矩陣,pandas中的get_dummies()函數可以實現該功能。

1 df = pd.DataFrame({'key':['b', 'b', 'a', 'c', 'a', 'b'],
2                   'data1':range(6)})
3 dummies = pd.get_dummies(df['key'], prefix='key')
        
5 #合並
6 df[['data1']].join(dummies)
      

         如果遇到DataFrame中某行同屬於多個類,處理如下。

 1 df = pd.DataFrame({'id':range(6), 
 2                   'key':['b|a|c', 'a|b|d', 'e|f', 'c', 'a', 'b'],
 3                   })
 4 df
 5 keys_iter = (set(x.split('|')) for x in df.key)   
 6 keys = sorted(set.union(*keys_iter))
 7 keys   #['a', 'b', 'c', 'd', 'e', 'f']
 8 dummies = pd.DataFrame(np.zeros((len(df), len(keys))), columns=keys)
 9 dummies
      
10 for i, key in enumerate(df.key):    #enumerate(df.key)   返回迭代對象的(索引,值)
11   dummies.loc[i, key.split('|')] = 1
12 dummies
13 df.join(dummies.add_prefix("key_"))
        

        3、二者結合使用

1 np.random.seed(12345)
2 values = np.random.randn(10)
3 bins = [0, 0.2, 0.4, 0.6, 0.8, 1]
4 
5 pd.get_dummies(pd.cut(values, bins))
        


免責聲明!

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



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