本文共 2055 字,大约阅读时间需要 6 分钟。
缺失值从缺失的分布来讲可以分为完全随机缺失,随机缺失和完全非随机缺失。
完全随机缺失(missing completely at random,MCAR)指的是数据的缺失是随机的,数据的缺失不依赖于任 何不完全变量或完全变量。例如一个班有五名同学的数学成绩缺失,缺失原因是课代表去送卷子的时候,路上一阵 大风把卷子吹散了,找回来的时候少了五份试卷,完全随机的少了五个成绩,这种情况就是完全随机缺失 随机缺失(missing at random,MAR)指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变 量。例如缺失的五个数学成绩全是男生的,因为这个班的座次是一半男生一半女生,课代表收试卷的时候男生的试 卷全在上边,最先被风吹跑了五份,剩下的试卷被护住了,这五个成绩的缺失和学生考试成绩本身没关系,但是和学 生的座次有关系,这种情况就是随机缺失。
完全非随机缺失(missing not at random,MNAR)指的是数据的缺失依赖于不完全变量自身。例如缺失的五个数 学成绩是因为老师在判卷过程中,发现试卷的作答差的没法看,一气之下给撕了而导致成绩缺失,这个缺失只和成绩本身有关,与其他变量无关,这就是非随机缺失。
data1=pd.read_excel('test3.xlsx') # 导入表格就存在缺失值# 判断缺失值比较稳定的方法 pd.isna()pd.isna(np.nan)
#通过下面的命令执行,在数据框中性别的缺失值显示为NaN。 def f1(x): if x in { '男','女'}: return x else: return np.NaNdata1.性别=data1.性别.map(f1) data1# data1.isnull()缺失值显示为Ture,data1.isnull() # 等同于data1.isna()
#通过loc定义缺失值data1.loc[3,'性别']=None # 将性别的第三行的值定义为None
data1.dropna(axis=0,how='any')# axis = 0 为表示行 ,inplace = True 表示会更改原数据(默认为False),how='any',表示只要存在一个缺失值就删除整行data1.dropna(axis=0,how='any',subset=['身高','体重']) # 身高和体重任意列存在缺失值,就删除整行
#求各个变量的缺失值比例 data1.isnull().sum() #缺失值的个数data1.isnull().mean() # 缺失值的比例
# 布尔索引data1[data1.身高.isnull()] # 定位缺失值data1[(data1.身高.isnull())| (data1.性别.isnull())] # 定位多处缺失值
# 固定值填充data1['身高'].fillna(180,inplace=True)#上下文填充data1.性别.fillna(method='ffill') # 前项填充data1.性别.fillna(method='bfill') #后项填充,所以最后一位如果有缺失值,不会填充# 其他列填充data1['性别'].fillna(data1['身高']) # 用身高这列填充性别列# 线性插补 上下值的平均值填充data1["身高"]=data1.身高.interpolate()
# 用astype将列转化为strdata1=pd.read_excel("test3.xlsx") # 导入表数据data1 data1.loc[3,"性别"]=None # 定义缺失值data1 data1["性别1"]=data1["性别"].astype(str) # NaN缺失值采用astype(str)进行转换后变成了"nan"字符串.None变成了"None"字符串。data1 # 用astype将列转化为floatdata1['身高'].astype(str).astype(np.float) #字符串‘nan’,用astype,转化为float,会变成缺失值NaN。 # 用pd.to_numeric将列强制转化为数值pd.to_numeric(data1['性别'],errors='coerce') # errors参数设定为coerce的意思是如果不是数值格式的字符串则会转化为缺失值。errors参数的默认值为raise, 那么转化出现错误的时候就会有错误提示。
转载地址:http://txqbb.baihongyu.com/