数据分析实战--缺失值分析
2019-04-21 本文已影响6人
勤奋的土豆鹿鹿
数据缺失主要包括记录缺失和字段信息缺失等情况,其对数据分析会有较大影响,导致结果不确定性更加显著。
缺失值的处理:删除记录 / 数据插补 / 不处理
模块导入
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
0 创建数据
s = pd.Series([12,33,45,23,np.nan,np.nan,66,54,np.nan,99])
df = pd.DataFrame({'value1':[12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
'value2':['a','b','c','d','e',np.nan,np.nan,'f','g',np.nan,'g']})
Series直接判断是否是缺失值,返回一个Series
print('Series直接判断是否是缺失值')
print(s.isnull())
print('------')
Dataframe直接判断是否是缺失值,返回一个Series
print('Dataframe直接判断是否是缺失值')
print(df.notnull())
print('------')
通过索引判断
print('通过索引判断')
print(df['value1'].notnull())
print('------')
找到s和df的非空值
print('找到s和df的非空值')
s2 = s[s.isnull()==False]
df2 = df[df['value2'].notnull()]
print(s2)
print(df2)
print('------')
1、删除缺失值 - dropna
将s删除缺失值,df2为df删除缺失值的数据
drop方法:可直接用于Series,Dataframe
注意inplace参数,默认False → 生成新的值
创建数据
s = pd.Series([12,33,45,23,np.nan,np.nan,66,54,np.nan,99])
df = pd.DataFrame({'value1':[12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
'value2':['a','b','c','d','e',np.nan,np.nan,'f','g',np.nan,'g']})
print('将s删除缺失值,df2为df删除缺失值的数据')
s = s.dropna(inplace=True)
df2 = df.dropna()
print(s)
print(df2)
print('------')
2、填充/替换缺失数据 - fillna、replace
s.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value:填充值
注意inplace参数
s = pd.Series([12,33,45,23,np.nan,np.nan,66,54,np.nan,99])
df = pd.DataFrame({'value1':[12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
'value2':['a','b','c','d','e',np.nan,np.nan,'f','g',np.nan,'g']})
(1)用0填充
print('s用0填充')
s.fillna(0,inplace=True)
print(s)
print('------')
(2)用之前的数据填充
method参数:
pad / ffill → 用之前的数据填充
backfill / bfill → 用之后的数据填充
print('用之前的数据填充')
df['value1'].fillna(method = 'ffill',inplace=True)
print(df['value1'])
(3) df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
to_replace → 被替换的值、 value → 替换值
print('用replace填充')
s = pd.Series([1,1,1,1,2,2,2,3,4,5,np.nan,np.nan,66,54,np.nan,99])
s.replace(np.nan,'缺失数据',inplace=True)
print(s)
print('------')
3 缺失值插补
几种思路:均值/中位数/众数插补、临近值插补、插值法
创建数据
s = pd.Series([1,2,3,np.nan,3,4,5,5,5,5,np.nan,np.nan,6,6,7,12,2,np.nan,3,4])
分别求出均值/中位数/众数
u = s.mean()
me = s.median()
mod = s.mode()
(1) 用均值填补
print('用均值填补')
s.fillna(u,inplace=True)
print(s)
print('------')
(2)临近值插补
创建数据
print('临近值(后值)插补')
s = pd.Series([1,2,3,np.nan,3,4,5,5,5,5,np.nan,np.nan,6,6,7,12,2,np.nan,3,4])
s.fillna(method = 'bfill',inplace=True)
print(s)
print('------')
(3)插值法 —— 拉格朗日插值法,实际运用
创建数据
data = pd.Series(np.random.rand(100)*100)
data[3,6,33,56,45,66,67,80,90] = np.nan
缺失值的数量
data_c = data[data.isnull()]
print('缺失值数量为:%d'%(len(data)))
print(data_c)
密度图查看缺失值情况
fig,ax = plt.subplots(1,5,figsize=(20,5))
箱型图
data.plot.box(ax = ax[0])
密度图
data.plot(kind='kde',ax=ax[1],style='--',title = '密度图')
删除后图
data_d = data.dropna()
data_d.plot(kind='kde',ax=ax[2],style='--',title = '删除后的密度图')
中位数填充缺失值密度图
data_m = data.fillna(data.median())
data_m.plot(kind='kde',ax=ax[3],linestyle='--',title = '中位数填充缺失值密度图')
密度图拉格朗日插值后
创建函数,做插值,由于数据量原因,以空值前后5个数据(共10个数据)为例做插值
def na_c(s,n,k=5):
y = s[list(range(n-k,n+1+k))]
y = y[y.notnull()]
return
def na_c(s,n,k=5):
y = s[list(range(n-k,n+1+k))] # 取数
y = y[y.notnull()] # 剔除空值
return(lagrange(y.index,list(y))(n))
na_re = []
for i in range(len(data)):
if data.isnull()[i]:
data[i] = na_c(data,i)
na_re.append(data[i])
data.dropna(inplace=True) # 清除插值后仍存在的缺失值
data.plot(kind = 'kde',style = '--',ax = ax[4],grid = True,title = '拉格朗日插值后密度图',xlim = [-50,150])

更多资料欢迎关注公众号
