引子:大数据下,缺失值处理往往会被数据分析师忽略,比如自己。极端值的处理往往会得到比较多的重视,因为极端值直接改变整体的均值;受限于数据生产链路问题,极端值出现也非常高频。但是,缺失值却往往会被忽视。
目前,简单的处理方式是直接补成0或者过滤掉。
环境及文件配置
import pandas as pd
import numpy as np
df2=pd.read_csv('/Users/lushikang/Documents/Reference/learning_python/data_virtualization/pokemon.csv')
df2.info()
#仅作为实验考虑,数据过于规整,需人工制造出缺失值
df2=df2.replace(60, np.nan)
删除法
#过滤掉某个变量是空值的行,本质仍然是利用返回布林值的函数选择pandas的行
df2[df2.Attack.notnull()]
df2[df2.Attack.isnull()]
#dropna方法
df2.dropna(axis=0, how='any')
df2.dropna(axis=0, how='any', thresh=3)
df2.dropna(axis=0, how='any', subset=['Attack', 'HP'])
填充法
#填充为某个常数
df2.Attack.fillna(0)
#向前填充或者向后填充
df2.Attack.fillna(method='ffill')#向前填充
df2.Attack.fillna(method='bfill')#向后填充
#插值法
df2.Attack.interpolate()
缺失值的出现
#极端值替换
df2=df2.replace(60, np.nan)
#对特定列的极端值进行替换
df2.replace({'Attack':40, 'HP':50}, np.nan)
#记录不规范的进行替换
df2.replace('unknown', np.nan)
df2.replace(r'\s+', np.nan, regex=True)
使用其它对象填充缺失值
Attack_new=df2.Attack.copy()
#inplace参数的效果是,直接改变原来的series,而不是创造一个副本
Attack_new.fillna('fillna', inplace=True)
Attack_new
df2.Attack.combine_first(Attack_new)