利用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核心程式設計》