數據導入可見:《Python之Pandas知識點》
此文圖方便,就直接輸入數據了。
import pandas as pd
df = pd.DataFrame({'一班':[90,80,66,75,99,55,76,78,98,None,90], '二班':[75,98,100,None,77,45,None,66,56,80,57], '三班':[45,89,77,67,65,100,None,75,64,88,99]})
1缺失值處理
# 如何判斷缺失值 df.isnull() # isna() df.notnull() # notna()
1.1刪除法
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- axis:表示軸向。默認為0,表示刪除所有含有空值的行。
- how:表示刪除的方式。默認為any。為any的時候,表示只要存在缺失值就刪除。為all的時候,表示全部是缺失值才能刪除。
- subset:表示刪除的主鍵,默認為全部。注意,使用任意主鍵均需要將其放入list中。且主鍵和axis對應。
- inplace:表示是否對原數據進行操作。默認為False,不對原數據操作。
# 刪除第九行 df.fropna(axis=0, how='any', subset=['一班'])
1.2定值替換法
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
- value:表示傳入的定值。可為某一個值,dict,Series,DataFrame。無默認
- method:此參數存在,則不傳入value。表示使用前一個非空值或后一個非空值進行缺失值填補。無默認。
- axis:表示軸向。
- inplace:表示是否對原數據進行操作。默認為False,不對原數據操作。
- limit:表示插補多少次。默認全量插補。
df.fillna(-999)
# 分別填補 df.fillna({'一班':-60,'二班':-70,'三班':-80})
# 將每一列的空值插補為該列的均值 df.fillna(df.mean())
# 用上一個數值進行填補 df.fillna(method = 'ffill')
1.3插補法
刪除法簡單易行,但是會引起數據結構變動,樣本減少;而替換法使用難度較低,但是會影響數據的標准差,導致信息量變動。在面對數據缺失問題時,除了這兩種方法之外,還有一種常用的方法——插值法。
# 默認是線性插值linear df.interpolate()
常用的插值法有線性插值、多項式插值、樣條插值等。
- 線性插值是一種相對來說較為簡單的插值方法,它針對已知的值求出線性方程,通過求解線性方程得到缺失值;
from scipy.interpolate import interp1d # 注意這里是數字1,不是l num = df['一班'][df['一班'].notnull()] # 不為空的數據 LinearInsValue1 = interp1d(linear.index, linear.values, kind='linear') LinearInsValue1(df['一班'][df['一班'].isnull()].index)
- 多項式插值是利用已知的值擬合一個多項式,使得現有的數據滿足這個多項式(拉格朗日插值、牛頓插值等),再利用這個多項式求解缺失值;
from scipy.interpolate import lagrange LagInsValue = lagrange(linear.index, linear.values) # 沒有kind形參 LagInsValue(df['一班'][df['一班'].isnull()].index)
- 樣條插值是以可變樣條來作出一條經過一系列點的光滑曲線的插值方法,插值樣條由一些多項式組成,每一個多項式都是由相鄰兩個數據點決定,這樣可以保證兩個相鄰多項式及其導數在連接處連續。
from scipy.interpolate import spline # sp 線 # 代碼合為一行了 spline(linear.index, linear.values, xnew=df['一班'][df['一班'].isnull()].index)