1. 程式人生 > >利用python Pandas進行資料預處理

利用python Pandas進行資料預處理

 目錄:       1.安裝pandas

                2.pandas的引入

                3.資料清洗

                       ①處理缺失資料

                       ②檢測和過濾異常值

                       ③移除重複資料

                 4.資料整合

                        A.使用鍵引數的DataFrame合併

                        B.軸向連線

                 5.資料變換

                        A.利用函式或對映進行資料轉換

                        B.替換值

                        C.重新命名軸索引

                        D.離散化和麵元

1.安裝pandas

   直接使用命令 pip install  pandas 安裝即可(我使用的是python3)。

2.pandas的引入

from pandas import Series,DataFrame
import pandas as pd
import numpy as np
## Series:一維陣列,與Numpy中的一維Array類似。二者與python基本的資料結構List也類似,其區別在於:List中的元素可以是不同的資料型別。二Array和Series中則只允許儲存相同的資料型別,這樣可以更高效的使用記憶體,提高運算速度

##DataFrame:二維的表格型陣列結構。可將DataFrame理解為Series的容器

##########下面來看一下Series的應用:


         可以看出,Series包含一個數組的資料和一個與陣列關聯的資料標籤,被叫做索引。Series是一個類似一維陣列的物件。Series物件包含兩個重要的屬性:index和values。分別為上面的左右兩列。


     上面是在初始化的時候以關鍵字引數顯示的指定一個index物件,Series物件的元素會嚴格依照給出的index構建。也就是說,如果data引數是有鍵值對的,那麼只有index中含有的鍵會被使用;以及如果data中缺失相應的鍵,即使給出NaN(浮點值,表示浮點和非浮點陣列中的缺失資料)值,這個鍵也會被新增。還有就是data與index要對應。

   另外,Series物件和他的index都含有一個name屬性:


########接下來看一下DataFrame

廢話不多講,直接上程式碼:


#如果你設定了一個列的順序,DataFrame的列將會精確的按照你所傳遞的順序排列:


#如果你傳遞了一個行,但不包括在data中,在結果中他會表示為NA值:


#在DataFrame中的一列可以通過字典記法或屬性來檢索:


#也可以使用一些方法通過位置或名字來檢索,這裡我們使用ix索引:


#對於列我們可以通過賦值來修改:


3.資料清洗

   建議看這部內容時,把資料清洗搞清楚再返回來看。

   ①處理缺失資料


#python內建的None值也會被當做NA處理:


處理NA的方法有四種:

      is(not)null:這一對方法對物件做元素級應用,然後返回一個bool型陣列,一般可用於bool型索引。

      dropna:對於一個Series.dropna返回一個僅含非空資料和索引值的Series。

      fillna:fillna(value=None,method=None,axis=0)中的引數value除了基本型別外,還可以使用字典,這樣可以實現對不同的列填充不同的值。

    過濾掉缺失資料的辦法有很多種。純手工操作永遠是一個辦法,但dropna可能會更實用。對於一個Series,dropna返回一個僅含非空資料和索引值的Series。


  而對於DataFrame物件,事情有點複雜。你可能希望丟棄全為NA或含有NA的行貨列。dropna預設丟棄任何含有缺失值的行:



   傳入how將只會丟棄全為NA的那些行:


如果需要用這種方法丟棄列時,只需傳入axis=1即可:


   另一種去掉DataFrame行的問題設計時間序列資料。假設你只想留下一部分觀測資料,可以用thresh引數實現此目的:


   不想過濾缺失資料(有可能會丟棄跟他有關的其他資料),而是希望通過其他方式填補那些“空洞”。對於大多數情況而言,fillna方法是最主要的函式。通過一個常數呼叫fillna就會將缺失值替換為那個常數值:


   若是通過一個字典呼叫fillna,就可以實現對不同的列填充不同的值:


  可以利用fillna實現許多別的功能。比如說,你可以傳入Series的平均值或中位數:


     ②檢測和過濾異常值

    異常值的過濾或變換運算在很大程度上就是陣列運算。如下一個(1000,4)的標準正態分佈陣列:


   假設要找出某一列中絕對值大小超過3的項:


   要選出全部含有“絕對值超過3的值”的行,可以利用布林型索引和any方法:


    ③移除重複資料

在DataFrame中往往會出現重複行,在DataFrame中的duplicated方法返回一個bool型Series,表示各行是否是重複行,還有一個與此相關的drop_duplicates方法,它用於返回一個移除了重複行的DataFrame。這兩個方法預設會判斷全部列,我們也可以指定部分列進行重複項判斷。假設你還有一列值,且只希望根據k1列過濾重複項。duplicated和drop_duplicates預設保留的是第一個出現的值組合。傳入take_last=True則保留最後一個,在python3中使用keep=‘last’。



4.資料整合

    在python中,pandas,merge可以根據一個或多個鍵將不同DataFrame中的行連線起來;pandas.concat可以沿著一條軸將多個物件堆疊到一起;例項方法combine_first可以用一個物件中的值填充另一個物件中對應位置的缺失值。

A.使用鍵引數的DataFrame合併


     讓我們來看一下這些引數是什麼意思。on=None用於顯示指定列名(鍵名),如果該列在兩個物件上的列名不同,則可以通過left_on=None,right_on=None來分別指定。或者想直接使用列索引作為連線鍵的話,就將left_index=False,right_index=False設為True。how='inner'引數指的是當左右兩個物件中存在不重合的鍵時,取結果的方式:inner代表交集,outer代表並集,left和right分別為取一邊。suffixes=('_x','_y')指的是當左右物件中存在除連線鍵外的同名列時,結果集中的區分方式,可以各加一個小尾巴。


B.軸向連線

  merge演算法是一種整合的話,軸向連線pd.concat()就是單純的把兩個表拼在一起,這個過程也被稱為連線,繫結或堆疊。引數axis用於指定連線的軸向。本函式的全部引數為:


其中,objs就是需要連線的物件集合,一般是列表或字典;axis=0是連線軸向;join=‘outer’引數作用於當另一條軸的index不重疊的時候,只有‘inner’和‘outer’可選。


5.資料變換

A.利用函式或對映進行資料轉換

  Series或DataFrame的列都可以呼叫有個.map()方法。該方法接受一個函式或字典作為引數,並將之應用於物件的每一個元素,最後返回一個包含所有結果的Series。


B.替換值

    fillna方法填充缺失值可以看做值替換的一種特殊情況,map也可以用來修改物件的資料子集,而.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method='pad',axis=None)方法則提供了實現該功能的一種更簡單,更靈活的方式。


C.重新命名軸索引

    Pandas物件的index引數是不可變的,即不可以直接對其元素進行賦值操作。但你卻可以對其使用obj.index.map()方法。

    也可以直接對陣列物件呼叫obj.rename(index=None,columns=None)方法。


   跟Series一樣,軸標籤也有一個map方法:


   可以將其賦值給index,這樣就可以對DataFrame進行就地修改了:


  如果想要建立資料集的轉換版(而不是修改原始資料),比較多使用的方式是rename:


D.離散化和麵元

   為了便於分析,連續資料常常被離散化或拆分為“面元”,假設有一組人員資料,而你希望將他們劃分為不同的年齡組:


  接下來將這些資料劃分為‘18到25‘,‘26到35’,‘35到60’以及‘60以上’幾個面元。要實現該功能,你需要使用Pandas的cut函式:


   Pandas返回的是一個特殊的Categorical物件。你可以將其看作一組表示面元名稱的字串。實際上,它含有一個表示不同分類名稱的levels陣列以及一個為年齡資料進行標號的labels屬性:


    跟“區間”的數學符號一樣,圓括號表示開端,而方括號則表示閉端。哪邊是閉端可以通過right=False進行修改:


參考資料:   《python與資料科學》王仁武編著

             《python核心程式設計》