【數據分析&數據挖掘】缺失值的檢測與處理——刪除法、填充法&插值法


  1 import pandas as pd
  2 import numpy as np
  3 
  4 # 加載數據
  5 data = pd.read_excel("../day07/qs.xlsx")
  6 # print("data: \n", data)
  7 print("data的列索引: \n", data.columns)
  8 print("data的數據類型: \n", data.dtypes)
  9 
 10 # 1、檢測缺失值
 11 # isnull 檢測缺失值 經常和sum連用, 推薦使用
 12 res_null = pd.isnull(data).sum()
 13 print("res: \n", res_null)
 14 # notnull 檢測缺失值 經常和sum連用
 15 print("data的形狀: \n", data.shape)
 16 res = pd.notnull(data)
 17 print("res: \n", res)  # 輸出bool-Dataframe
 18 
 19 # 2、處理缺失值
 20 # 刪除法: 簡單,但是容易造成數據的大量丟失
 21 # how = "any" ——只要有缺失值就刪除
 22 # how = "all" ——只有全行或者全列都為缺失值才刪除
 23 # axis
 24 # inplace
 25 print("~"*60)
 26 data.dropna(how="any", axis=0, inplace=True)
 27 data.dropna(how="any", axis=1, inplace=True)
 28 data.dropna(how="all", axis=0, inplace=True)
 29 print("刪除之后的結果: \n", data)
 30 
 31 
 32 # 填充法: 不會造成數據丟失,但是可能會影響數據的分布,可能會影響最終結果
 33 # 只要不影響數據分布或者對結果影響不是很大的情況
 34 # 數值型 ——可以使用均值、眾數、中位數來填充,也可以使用這一列的上下鄰居數據來填充
 35 # 類別數據(非數值型) ——可以使用眾數來填充,也可以使用這一列的上下鄰居數據來填充
 36 # 使用眾數來填充非數值型數據
 37 # (1)計算指標
 38 mode = data.loc[:, "門店編號"].mode()[0]
 39 print("mode: \n", mode)
 40 # (2)填充
 41 # 如果使用指標來填充,只需要value與inplace
 42 data.loc[:, "門店編號"].fillna(value=mode, inplace=True)
 43 
 44 # 填充類別id與商品id ——都為整數,可以使用指標——眾數
 45 # 使用上下鄰居來填充
 46 # method = backfill 或者 bfill 下一個非空鄰居
 47 # method = pad 或者ffill 上一個非空鄰居
 48 data.loc[:, "類別ID"].fillna(method="backfill", inplace=True)
 49 data.loc[:, "類別ID"].fillna(method="bfill", inplace=True)
 50 data.loc[:, "類別ID"].fillna(method="ffill", inplace=True)
 51 data.loc[:, "類別ID"].fillna(method="pad", inplace=True)
 52 print("填充之后的結果: \n", data)
 53 
 54 
 55 # 插值法
 56 # 線性插值 ——你和線性關系進行插值
 57 # 多項式插值 ——擬合多項式進行插值
 58 # 拉格朗日多項式插值、牛頓多項式插值
 59 # 樣條插值 ——擬合曲線進行插值
 60 x = np.array([1, 2, 3, 4, 5, 8, 9])
 61 y = np.array([3, 5, 7, 9, 11, 17, 19])
 62 z = np.array([2, 8, 18, 32, 50 ,128, 162])
 63 from scipy.interpolate import spline
 64 from scipy.interpolate import interp1d
 65 from scipy.interpolate import lagrange
 66 
 67 # 線型插值
 68 linear_1 = interp1d(x=x, y=y, kind="linear")
 69 linear_2 = interp1d(x=x, y=z, kind="linear")
 70 linear_3 = interp1d(x=x, y=y, kind="cubic")
 71 
 72 
 73 print("線性插值: \n", linear_1([6, 7])) # [13. 15.]  注意不是1是第一個索引
 74 # print("線性插值: \n", linear_1([5, 6])) # [11. 13.]
 75 print("線性插值: \n", linear_2([6, 7])) # [76. 102]
 76 print("線性插值: \n", linear_3([6, 7])) # [76. 102]
 77 
 78 # 拉格朗日插值
 79 la_1 = lagrange(x=x, w=y)
 80 la_2 = lagrange(x=x, w=y)
 81 
 82 print("拉格朗日: \n",  la_1)  # [13, 15]
 83 print("拉格朗日: \n",  la_2)  # [72, 98]
 84 
 85 # 樣條插值 ——擬合曲線進行差池
 86 print(spline(xk=x, yk=y, xnew=[6, 7]))  # [13, 15]
 87 print(spline(xk=x, yk=z, xnew=[6, 7]))  # [72, 98]
 88 
 89 # 對於線型關系,線型插值,表現良好,多項式插值,與樣條插值也表現良好
 90 # 對於非線型關系,線型插值,表現不好,多項式插值,與樣條插值表現良好
 91 # 推薦如果想要使用插值方式,使用拉格朗日插值和樣條插值
 92 
 93 
 94 # 對於非NaN類型的數據——先將非NaN類型的數據轉化為np.nan
 95 data.replace("*", np.nan, inplace=True)
 96 print("data: \n", data)
 97 # 替換之后,可以刪除、填充、插值
 98 data.loc[:, "門店編號"].fillna(value=mode, inplace=True)
 99 print("最終的data: \n", data)
100 print(type(np.nan))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM