日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础)

發布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

          • 1、缺失數據的類型
          • 2、定位缺失數據
          • 3、修改定位數據
          • 4、批量修改缺失數據
          • 5、數據修復的利器--插值法(`interpolate`)
          • 本系列教程教程完整目錄:

數據清洗的內容其實很豐富,其中最基本的問題就是對一些缺失數據的處理。比如我們常會看到這樣的表:

First ScoreSecond ScoreThird Score
010030
1904540
25680
39598

在普遍的辦公場景下(尤其是一些重要的表格),通常都有可能是有特殊的情況,那么此時都一定會去手動修改,甚至有時還會特別麻煩(比如銀行的某些信息)。但我們在競賽中,研究中,做項目的過程中對這些數據就可以自由一點,希望能利用經驗知識等來對它們進行一定的處理。

本文就從這類問題入手講解一下在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='pad') Out[154]: 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 90.0 56.0 80.0 3 3 95.0 56.0 98.0df.fillna(method='bfill') Out[155]: 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 95.0 56.0 80.0 3 3 95.0 NaN 98.0

另外還可對填充次數進行限制,比如只允許填充一次:

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缺失数据的处理(数据清洗基础)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。