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))
缺失值检测 Python 缺失值检测与处理
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
python 缺失值处理python