Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础)
文章目錄
- 1、缺失數據的類型
- 2、定位缺失數據
- 3、修改定位數據
- 4、批量修改缺失數據
- 5、數據修復的利器--插值法(`interpolate`)
- 本系列教程教程完整目錄:
數據清洗的內容其實很豐富,其中最基本的問題就是對一些缺失數據的處理。比如我們常會看到這樣的表:
| 0 | 100 | 30 | |
| 1 | 90 | 45 | 40 |
| 2 | 56 | 80 | |
| 3 | 95 | 98 |
在普遍的辦公場景下(尤其是一些重要的表格),通常都有可能是有特殊的情況,那么此時都一定會去手動修改,甚至有時還會特別麻煩(比如銀行的某些信息)。但我們在競賽中,研究中,做項目的過程中對這些數據就可以自由一點,希望能利用經驗知識等來對它們進行一定的處理。
本文就從這類問題入手講解一下在Pandas中如何處理這些數據。
1、缺失數據的類型
據官方文檔描述,由于在Python中None就是默認的空值類型,因此它首先就會被當作缺失數據處理。
其次Nan (not a number)也是常見的空值或者異常數據類型。
同時,官網說道:+-inf也可以被視作缺失數據,此時需要加設一句:
pandas.options.mode.use_inf_as_na = True比如上面的數據如果以逗號分隔存入csv文件,再讀取出來時是這樣:
df = pd.read_csv(r".\test_nan.csv") # 數據存在該文件中dfUnnamed: 0 First Score Second Score Third Score 0 0 100.0 30.0 NaN 1 1 90.0 45.0 40.0 2 2 NaN 56.0 80.0 3 3 95.0 NaN 98.0這里顯示的第一列是Index,第二列Unnamed:0是由于這一個位置是空,于是被自動命名為"未命名"表頭。而這里我們能清楚地看到,表中的空行已經被顯示為NaN。
不過要注意的是,此時如果csv文件中這些空值位置是空格或者Tab的話,它會被識別為’ ‘或者’ '。如果不明白就復制引號中的內容,再粘貼到word里面自然就清楚了。
2、定位缺失數據
Pandas中提供了判斷表中數據是否為缺失數據的方法isnull:
df.isnull()Unnamed: 0 First Score Second Score Third Score 0 False False False True 1 False False False False 2 False True False False 3 False False True False這里可以看到,所有NaN的位置全部變成了True。但光是這樣其實還遠不夠,尤其當數據量較大時,我們其實更想的是如果準確地定位這些數據,再想辦法對其進行修改。
當然我們常規的思路是想直接定位到它的行列值上,這樣就最方便,但Pandas并沒有提供這樣的一種方法,非常可惜。于是我們只能選擇退而求其次的方案。
首先,我們可以先簡單統計一下上哪些列有空值:
df.isnull().sum()Unnamed: 0 0 First Score 1Second Score 1Third Score 1 dtype: int64這個原理就很簡單了,由于df.isnull()函數返回的表中每列全是Bool類型,而sum()是針對數值的操作,默認就將Ture和False轉為1和0。那么對每列數據求和自然就統計出了缺失的數據總量。
其次,可以考慮直接從DataFrame的值入手,獲取缺失數據在其數據主體中所在的位置。
np.argwhere(np.isnan(df.values))array([[0, 3],[2, 1],[3, 2]], dtype=int64)%timeit np.argwhere(np.isnan(df.values)) 53.8 μs ± 68.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)這里是借助Numpy中的定位函數,也比較簡單,運行的時間也沒有想象中那么慢。
此時返回的數組中,第一個元素就是行數,第二個元素就是列所在的位置(也從0開始),那么也很容易找到它們對應的列名:
for i,j in np.argwhere(np.isnan(df.values)):print('The',j,'th Column name:',df.iloc[:,j].name)The 3 th Column name: Third Score The 1 th Column name: First Score The 2 th Column name: Second Score當然,還有更為高明的方法,可以參考Pandas缺失數據最快定位方式(極少代碼快速實現,打死不用循環!!!)
3、修改定位數據
能夠精準定位數據,自然也就可以對其進行修改了。最簡單的方式自然是給出每個位置應有的值,比如:
df.iloc[2, 1] = 32當然,這種方式與手動修改無異。我們想要看的是一些簡單暴力而又常用的方法。
4、批量修改缺失數據
- fillna()
比如我想將所有異常數據用一種夸張的形式填充:
df.fillna("!*#^@")Unnamed: 0 First Score Second Score Third Score 0 0 100 30 !*#^@ 1 1 90 45 40 2 2 !*#^@ 56 80 3 3 95 !*#^@ 98那么自然地,也可以用一些固定的數值來填充,比如:
df.fillna(-1)Unnamed: 0 First Score Second Score Third Score 0 0 100.0 30.0 -1.0 1 1 90.0 45.0 40.0 2 2 -1.0 56.0 80.0 3 3 95.0 -1.0 98.0這里注意到,fillna()中可以填充的類型是任意的,只要可以作為數據的東西都可以放進去,甚至包括Pandas的object. 這里就不再贅述,其實不用看官方文檔也能很容易試出來。
- 用前或者后(同一列的上一行或下一行)的數據填充:
另外還可對填充次數進行限制,比如只允許填充一次:
df.fillna(method='bfill',limit=1)這里由于每列數據只有一個空值,因此與上面的代碼結果無異。
5、數據修復的利器–插值法(interpolate)
可以看到上面缺失的數據都是數值,那么此時我們可以用插值的方式來處理,這種方式尤其在數據本身平穩并且量較充足的時候非常有用。同時也很自然地想到,這種操作對于我們參加數據挖掘競賽非常有利!
df.interpolate(method='linear')Unnamed: 0 First Score Second Score Third Score 0 0 100.0 30.0 NaN 1 1 90.0 45.0 40.0 2 2 92.5 56.0 80.0 3 3 95.0 56.0 98.0這里可以看到,多數空值都被填充了。它的原理是對現有的點進行線性插值,從而達到數據填充的目的。
另外,細心的同學應該也發現了,這里第一行最后一列數據并未被修改,這是因為默認的插值法是向前插值(即向下面的行進行插值),那么這里稍作修改即可:
df.interpolate(method='linear',limit_direction='backward') Out[166]: Unnamed: 0 First Score Second Score Third Score 0 0 100.0 30.0 40.0 1 1 90.0 45.0 40.0 2 2 92.5 56.0 80.0 3 3 95.0 NaN 98.0如果上下都想用,就用兩次即可:
df.interpolate(method='linear',limit_direction='backward').interpolate(method='linear',limit_direction='forward')Unnamed: 0 First Score Second Score Third Score 0 0 100.0 30.0 40.0 1 1 90.0 45.0 40.0 2 2 92.5 56.0 80.0 3 3 95.0 56.0 98.0注:Pandas在實現這類方法時實際上是調用的scipy的庫,因此需要提前將scipy裝好。
當然,插值的方法有很多,目前該方法提供的選擇如下:
- ‘linear’: 線性插值
- ‘index’, ‘values’: 用索引值直接填充.
- ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’:
- 其中: ‘polynomial’ ,‘spline’ 需要設置階數,如: df.interpolate(method='polynomial', order=5).
- ‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’, ‘akima’: scipy中對應的方法(名稱一致)
- ‘from_derivatives’: 采用方法scipy.interpolate.BPoly.from_derivatives
關于上述所有方法的說明可以直接參考scipy的文檔或者用戶說明。
本系列教程教程完整目錄:
一、Pandas簡介與安裝
二、Pandas基本數據結構-DataFrame與Series
三、Pandas文件讀寫
四、Pandas數據索引方式
五、Pandas簡單統計操作及通用方式
六、Pandas條件查詢
七、Pandas缺失數據的處理(數據清洗基礎)
八、Pandas數據透視表
九、表的合并、連接、拼接(數據聚合基礎)
總結
以上是生活随笔為你收集整理的Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas简明教程:六、Pandas条
- 下一篇: Pandas缺失数据最快定位方式(极少代