數據分析—缺失值處理

咱們獲取到的數據(尤爲是數據量比較大時),頗有可能會出現數據缺失、數據異常等問題,數據處理是數據分析裏十分重要且必須的一個環節,爲了在作數據分析時儘量減小異常的出現,以及得出更精準的分析結論,所以在作數據分析以前,數據處理顯得尤爲必要python

閱讀條件:熟悉pandas基本操做
使用工具:Python

使用平臺:jupyter notebook數組

缺失值處理

缺失值判斷

python主要讀取的是csv或者excel數據,excel中單元格爲空時,pandas讀取顯示的是NaN,即爲缺失值bash

判斷缺失值數據方法:isnull,notnull函數

  • isnull:True表示缺失,False表示非缺失
  • notnull:True表示非缺失,False表示缺失

首先導入python數據分析必選工具包
工具

import numpy as np
import pandas as pd
__author__='莫嘆'複製代碼

生成一個表格型的二維數組dfui

#生成一個表格型的二維數組
df=pd.DataFrame({'a':[34,6,20,np.nan,56],
               'b':['juejin','number','one','good',np.nan]})複製代碼

輸出以下:spa


判斷數據中是否存在缺失值以及非缺失值數據篩選:3d

#判斷二維數組df是否缺失
print(df.notnull(),'\n')
#經過索引判斷a列是否缺失
print(df['a'].notnull(),'\n')
#篩選a列不存在缺失值數組
print(df[df['a'].notnull()])複製代碼

輸出以下:excel

a      b
0   True   True
1   True   True
2   True   True
3  False   True
4   True  False 

0     True
1     True
2     True
3    False
4     True
Name: a, dtype: bool 

      a       b
0  34.0  juejin
1   6.0  number
2  20.0     one
4  56.0     NaN複製代碼

缺失值刪除

經過上面的notnull布爾序列值篩選也是缺失值刪除的一種方法

缺失值的刪除須要按照具體數據狀況和業務狀況來處理,有時候須要刪除所有缺失數據,有時候須要刪除部分缺失數據,有時候只是須要刪除指定缺失數據。code

刪除缺失值的方法:dropna(axis)

  • 默認參數axis = 0,爲刪除行數據,當參數axis = 1刪除列數據(可是通常不會選擇axis=1,若是爲1,則直接刪除了一整個變量數據)
  • 傳入thresh=n時保留至少有n個非NaN數據的行

#生成一個表格型二維數組
df2=pd.DataFrame([[1,2,3],['juejin',np.nan,np.nan],['a','b',np.nan],[np.nan,np.nan,np.nan],['d','j','h']],
                 columns=list('ABC'))
print(df2,'\n')
#刪除全部存在缺失值的行
print(df2.dropna(),'\n')
#刪除部分存在缺失值的行,保留至少有n個非NaN數據的行(好比保留至少有一個非NaN數據的行)
print(df2.dropna(thresh=1),'\n')
#刪除某一列存在缺失值的行(刪除A列裏存在缺失值的全部的行,和上面的布爾值序列篩選相同)
print(df2[df2['A'].notnull()])複製代碼

輸出以下:

A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3     NaN  NaN  NaN
4       d    j    h 

   A  B  C
0  1  2  3
4  d  j  h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
4       d    j    h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
4       d    j    h複製代碼

缺失值填充/替換

填充方法:fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

  • value參數:填充值
  • method參數: pad / ffill → 用以前的數據填充,backfill / bfill → 用以後的數據填充

替換方法:replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)

  • to_replacec參數:被替換的值
  • value參數:替換值

使用舉例以下:

import copy
df3=pd.DataFrame([[1,2,3],['juejin',np.nan,np.nan],['a','b',np.nan],['k',np.nan,np.nan],['d','j','h']],
                 columns=list('ABC'))
df4=copy.deepcopy(df3)
print(df3,'\n')
#缺失值所有用 0 填充
print(df3.fillna(0),'\n')
#method=‘pad’,使B列每個缺失值用缺失值的前一個值填充
df3['B'].fillna(method='pad',inplace=True)
print(df3,'\n')
#用replace替換
print(df4,'\n')
df4.replace(np.nan,'juejin',inplace = True)
print('將缺失值替換爲juejin\n',df4)複製代碼

A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3       k  NaN  NaN
4       d    j    h 

        A  B  C
0       1  2  3
1  juejin  0  0
2       a  b  0
3       k  0  0
4       d  j  h 

        A  B    C
0       1  2    3
1  juejin  2  NaN
2       a  b  NaN
3       k  b  NaN
4       d  j    h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3       k  NaN  NaN
4       d    j    h
將缺失值替換爲juejin
         A       B       C
0       1       2       3
1  juejin  juejin  juejin
2       a       b  juejin
3       k  juejin  juejin
4       d       j       h複製代碼

缺失值插值

上面講到缺失值的填充,可是在實際的數據處理過程當中,對於缺失值的處理不是隨便找個數據所有填充,而是有針對性的對每一個局部缺失值進行插值填充。

這裏選擇幾種經常使用的具備表明性的缺失值插值方法:

  • 中位數/衆數/平均值插值
  • 臨近值插值
  • 拉格朗日值插值
中位數/衆數/平均值插補


#生成一個一維數組
s1=pd.Series([6,4,2,5,4,3,3,7,np.nan,3,9,np.nan,1])
print(s1,'\n')
med=s1.median()#中位數
mod=s1.mode()#衆數
avg=s1.mean() #平均值
print('中位數,衆數,平均數分別爲:%.2f,%.2f,%.2f'%(med,mod,avg))
#以平均值爲例
s1.fillna(avg)複製代碼

0     6.0
1     4.0
2     2.0
3     5.0
4     4.0
5     3.0
6     3.0
7     7.0
8     NaN
9     3.0
10    9.0
11    NaN
12    1.0
dtype: float64 

中位數,衆數,平均數分別爲:4.00,3.00,4.270     6.000000
1     4.000000
2     2.000000
3     5.000000
4     4.000000
5     3.000000
6     3.000000
7     7.000000
8     4.272727
9     3.000000
10    9.000000
11    4.272727
12    1.000000
dtype: float64複製代碼

臨近值插補

這點其實在上面缺失值填充裏提到了,主要是method這個參數,可選擇缺失值位置前一個或者和一個位置上數據填充相同的數據便可,可參考df3

fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

method參數: pad / ffill → 用以前的數據填充,backfill / bfill → 用以後的數據填充

拉格朗日插值法

許多實際問題中都用函數來表示某種內在聯繫或規律,而很多函數都只能經過實驗和觀測來了解。如對實踐中的某個物理量進行觀測,在若干個不一樣的地方獲得相應的觀測值,拉格朗日插值法能夠找到一個多項式,其剛好在各個觀測的點取到觀測到的值。這樣的多項式稱爲拉格朗日(插值)多項式。數學上來講,拉格朗日插值法能夠給出一個剛好穿過二維平面上若干個已知點的多項式函數。

限於篇幅,這裏就粗糙的講解一下拉格朗日插值法的計算過程

根據數學知識,對於平面上已知的n個點,能夠找到一個n-1次多項式:


當咱們知道前面的n-1個座標點(x1,y1),(x2,y2)......(xn-1,yn-1)的值時,代入上面公式能夠獲得以下的一個多元方程


經過這個多元方程,咱們就能夠計算出參數a0,a1,.....an-1的值,知道了這個多元方程的各個參數,也就是知道了一個y與x之間的函數方程,傳入x值,就能夠計算出對應的缺失的y值(一個近似值),形如上面計算值得過程叫作拉格朗日插值法。

在python裏,有一個十分方便計算拉格朗日插值的工具庫,具體使用和實現過程直接在下面代碼裏舉例實現

咱們隨意選擇一組數據(3,6)、(7,9)、(8,5)、(9,8)利用拉格朗日插值法算出過這些點的函數方程,而後輸入咱們須要插值的x的值,天然能夠獲得y值。

#導入拉格朗日插值法計算和做圖包
from scipy.interpolate import lagrange
import matplotlib.pyplot as plt
% matplotlib inline
#任意建立一個有缺失值的二維數組
s2=pd.DataFrame({'x':[3,7,12,8,9],'y':[6,9,np.nan,5,8]})
#x值
x=[3,7,8,9]
#y值
y=[6,9,5,8]
#生成這幾個點的散點圖
plt.scatter(x,y)
#求出函數方程
print(lagrange(x,y))
#選擇一個x=12,計算插入值
print('插值12爲%.2f' % lagrange(x,y)(12))複製代碼

生成的函數(上面的數字3和2表示x³和x²)、對應的缺失值插值、散點圖以下:

3        2
0.7417 x - 14.3 x + 85.16 x - 140.8

插值12103.50

複製代碼

因此x=12時,對應的缺失值能夠用103.50來插入代替

相關文章
相關標籤/搜索