Python数据分析之缺失值处理
数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,去除与数据挖掘主题无关的数据,处理缺失值、异常值等。这里主要讲对数据中的缺失值进行处理。
类型
缺失值主要分为完全随机缺失,随机缺失和完全非随机缺失三类。
完全随机缺失(missing completely at random,MCAR)
数据的缺失是随机的,数据的缺失不依赖于任何不完全变量或完全变量。
随机缺失(missing at random,MAR)
数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。
完全非随机缺失(missing not at random,MNAR)
数据的缺失依赖于不完全变量自身。
处理方式
处理缺失值的方法可分为3类:删除记录、数据插补和不处理。
删除数据
生成缺失值:
import pandas as pdimport numpy as np# 生成缺失数据df = pd.DataFrame(np.random.randn(6, 4), columns=['A', 'B', 'C', 'D']) # 生成一份数据df.iloc[1:2, 1] = np.nan # 增加缺失值df.iloc[3, 2] = np.nan # 增加缺失值df.iloc[4,3] = np.nan # 增加缺失值print (df)
输出:
检测缺失值
nan_all = df.isnull() # 获得所有数据框中的N值
print (nan_all) # 打印输出# 查看哪些列缺失nan_col1 = df.isnull().any() # 获得含有NA的列print (nan_col1) # 打印输出nan_col2 = df.isnull().all() # 获得全部为NA的列print (nan_col2) # 打印输出
输出:
删除缺失值:
df1 = df.dropna() # 直接删除含有NA的行记录print (df1) # 打印输出
输出:
数据插补
常用的插补方法有:
均值/中位数/众数插补
使用固定值
最近邻插补
回归方法
插值法
此处只简要列出两类插补方式的代码。
均值/中位数/众数插补
df_mean = df.fillna(np.mean(df)) # 均值插补print (df_mean)# 中位数插补 df_median = df.fillna(np.median(df))
# 众数插补 df_mode = df.fillna(np.argmax(np.bincount(df)))
输出:
拉格朗日插值法
from scipy.interpolate import lagrange #导入拉格朗日插值函数#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5def ployinterp_column(s, n, k=5):y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数y = y[y.notnull()] #剔除空值return lagrange(y.index, list(y))(n) #插值并返回插值结果#逐个元素判断是否需要插值for i in df.columns:for j in range(len(df)):if (df[i].isnull())[j]: #如果为空即插值。df[i][j] = ployinterp_column(df[i], j)print (df)
输出:
在处理缺失值时,直接删除减少了数据的完备性,造成了资源浪费,同时丢弃了大量隐藏在这些记录中的信息,因此,我们最常使用的方式是插补。在大量的插补方法中,最推荐使用插值法,这种方式能极大的保留这些缺失数据的特性。