Python數據分析庫pandas ------ pandas 刪除重復元素、用映射替換添加元素、重命名軸索引、離散化、異常值檢測和過濾、排序


 數據轉換

 刪除重復元素

  DataFrame對象的duplicated()函數可用來檢測重復的行,返回元素為布爾型的Series對象。 每個元素對

應一行,如果該行與其他行重復(也就是說該行不是第一次出現),則元素為True; 如果跟前面不重復,則元

素就為False。

  返回元素為布爾值的Series對象用處很大,特別適用於過濾操作。通常,所有重復的行都需要從DataFrame

對象中刪除。pandas庫的drop_duplicates()函數實現了刪除功能,該函數返回的是刪除重復行后的DataFmme對

象。

 

 1 dframe = pd.DataFrame({ 'color': ['white','white','red','red','white'],'value': [2,1,3,3,2]})  2 print(dframe)  3 print(dframe.duplicated())  4 # 返回元素為布爾值的Series對象用處很大,特別適用於過濾操作。  5 print( dframe[dframe.duplicated()])  6 print(dframe.drop_duplicates())  7 輸出:  8  color value  9 0 white 2 10 1 white 1 11 2 red 3 12 3 red 3 13 4 white 2 14 0 False 15 1 False 16 2 False 17 3 True 18 4 True 19 dtype: bool 20  color value 21 3 red 3 22 4 white 2 23  color value 24 0 white 2 25 1 white 1 26 2 red 3

 

 用映射替換元素

  要用新元素替換不正確的元素,需要定義一組映射關系。在映射關系中,舊元素作為鍵,新元素作為值。

  DataFrame對象中兩種舊顏色被替換為正確的元素。還有一種常見情況,是把NaN替換為其他值,比如0。

這種情況下,仍然可以用replace()函數,它能優雅地完成該項操作。

 1 frame8 = pd.DataFrame({  2 'item': ['ball', 'mug', 'pen', 'pencil', 'ashtray'],  3 'color': ['white', 'rosso', 'verde', 'black', 'yellow'],  4 'price': [5.56, 4.20, 1.30, 0.56, 2.75]  5 })  6 print(frame8)  7 newcolors = {  8 'rosso': 'red',  9 'verde': 'green' 10 } 11 print(frame8.replace(newcolors)) 12 13 ser = pd.Series([13, np.nan, 4, 6, np.nan, 3]) 14 print(ser.replace(np.nan, 0))

  輸出結果:

  

 

 用映射添加元素

  下面只是部分功能的展示,詳情請參考官方文檔

 1 frame9 = pd.DataFrame({  2 'item':['ball','mug','pen','pencil','ashtray'],  3 'color':['white','red','green','black','yellow']  4 })  5 print(frame9)  6 price = {  7 'ball' : 5.56,  8 'mug' : 4.20,  9 'bottle1' : 1.30, 10 'scissors' : 3.41, 11 'pen' : 1.30, 12 'pencil' : 0.56, 13 'ashtray' : 2.75 14 } 15 frame9['price'] = frame9['item'].map(price) # 這里是按‘item’的對應關系添加 16 print(frame9)

  輸出結果:

  

  官方文檔案例:

1 df = pd.DataFrame({ 2 'A': ['bat', 'foo', 'ibat'], 3 'B': ['abc', 'bar', 'xyz'] 4 }) 5 # r'^ba.$'是匹配最后三個字符中前面量為ba的;$匹配結尾的 6 print(df.replace(to_replace=r'^ba.$', value='new', regex=True))

  輸出結果:(上面關於正則的知識點請點擊參考博客

  

 

 重命名軸索引

   對於只有單個元素要替換的最簡單情況,可以對傳入的參數做進一步限定,而無需把多個變 量都寫出來,

也避免產生多次賦值操作。對於多個元素替換最好用字典先寫好。

 1 reindex = {  2 0:'first',  3 1:'second',  4 2:'third',  5 3:'fourth',  6 4:'fifth'  7 }  8 print(frame9.rename(reindex))  9 recolumn ={ 10 'item':'object', 11 'price':'value' 12 } 13 print(frame9.rename(index=reindex,columns=recolumn)) # 不會改變原數據frame9 14 print(frame9) 15 print(frame9.rename(index={1:'first'},columns={'item':'object'})) 16 # inplace=True用於指定在原數據frame9上面改 17 frame9.rename(index={1:'first'},columns={'item':'object'},inplace=True) 18 print(frame9)

  輸出結果:

             

 

  離散化和面元划分

   每個面元的出現次數,即每個類別有多少個元素,可使用value_counts()函數。

   cut 是等差划分面元, qcut 是根據分位數划分面元。

 1 ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]  2 bins = [18, 25, 35, 60, 100]  3 # cut(x, bins, right=True, labels=None, retbins=False, precision=3,  4 # include_lowest=False, duplicates='raise')  5 cat = pd.cut(ages, bins)  6 print(cat, "\n-----* 1 *-----\n")  7 # cat.codes 輸出每個元素對應的面元編碼  8 print(cat.codes, "\n-----* 2 *-----\n")  9 print(pd.value_counts(cat), "\n-----* 3 *-----\n") # 查看每個面元中元素的數量 10 cuts = pd.cut(ages, bins, right=False) # 使用right=False可以修改開端和閉端 11 print(cuts, "\n-----* 4 *-----\n") 12 cut1 = pd.cut(ages, bins, right=False, labels=list('abcd')) 13 print(cut1, "\n-----* 5 *-----\n") 14 15 print(pd.cut(ages, 5), "\n-----* 6 *-----\n") # 如果cut傳入的是數字n,那么就會均分成n份。 16 print(pd.value_counts(pd.cut(ages, 4)), "\n-----* 7 *-----\n") 17 # qcut 18 # qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise') 19 # 基於分位數的離散化函數。將變量離散成 20 # 基於等級或基於樣本分位數的相等大小的面元。 21 print(pd.qcut(ages, 5), "\n-----* 8 *-----\n") 22 print(pd.value_counts(pd.qcut(ages, 4)), "\n-----* 9 *-----\n")

 

  輸出結果:

  

  

  

 

  異常值檢測和過濾

  假設將比標准差大3倍的元素視作異常值。用std()函數就可以求得DataFrame對象每一列的標准差。

1 data = pd.DataFrame(np.random.randn(1000,3)) 2 print(data.describe()) 3 print(data.std()) 4 print(data[(np.abs(data)>(3*data.std())).any(1)]) # 過濾條件 any(1)只要有一個大於3*sigma就滿足條件

  

 

 排序

1 nframe = pd.DataFrame(np.arange(25).reshape(5,5)) 2 new_order = np.random.permutation(5) #亂序整數[0-4] 如果是100 [0-99] 3 print(nframe.take(new_order)) #排序 4 print(np.random.permutation(100)) 5 print(nframe.take([3,4,2])) #只對一部分排序 6 sample = np.random.randint(len(nframe),size =3) #隨機整數 7 print(nframe.take(sample))

  輸出結果:

  

 


免責聲明!

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



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