series 通过值返回index_数据分析实战-- 缺失值处理

数据缺失主要包括记录缺失和字段信息缺失等情况,其对数据分析会有较大影响,导致结果不确定性更加显著。

缺失值的处理:删除记录 / 数据插补 / 不处理

模块导入

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])

41e138ccf3fd6dbcf4db8a44acf4a3aa.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值