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

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

1.判断是否有缺失数据

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from scipy import stats

% matplotlib inline

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

df

# 创建数据

判断是否有缺失值数据 - isnull,notnull

isnull:缺失值为True,非缺失值为False

notnull:缺失值为False,非缺失值为True

s.isnull() df.notnull()适用于Series和DataFrame;

s[s.isnull() == False] #把不是缺失值的给找出来,只针对Series ;

print(s.isnull()) #布尔型的一个结果,只要有一个是NaN就是True; Series直接判断是否是缺失值,返回一个Series

print(df.notnull())#判断不是缺失值的有哪些,可以加索引判断如print(df['value1'].notnull()) ;直接判断是否是缺失值,返回一个Series

0 False

1 False

2 False

3 False

4 True

5 True

6 False

7 False

8 True

9 False

dtype: bool

value1 value2

0 True True

1 True True

2 True True

3 True True

4 False True

5 False False

6 True False

7 True True

8 False True

9 True False

10 True True

print(s[s.isnull() == False]) #把不是缺失值的给找出来。 <<<===>>> s[s.notnull()] 布尔型的索引

print(df[df['value2'].notnull()]) # 注意和 df2 = df[df['value2'].notnull()] ['value1'] 的区别

##筛选非缺失值

2. 删除缺失值 - dropna

.dropna(inplace = True)

# 删除缺失值 - dropna

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

# 创建数据

s.dropna(inplace = True)

s

df.dropna(inplace =True)

df

3.填充/替换缺失值

s.fillna(0,inplace = True) 缺失值用0来填充;

df['value1'].fillna(method = 'pad',inplace = True) 缺失值的用pad/ffill之前前一个数据填充;

s.replace(np.nan,'缺失数据',inplace = True) 把np.nan的数据用 ‘缺失数据’来代替;

s.replace([1,2,3],np.nan,inplace = True) 也可以替换多值。

# 填充/替换缺失数据 - fillna、replace

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

# 创建数据

s.fillna(0,inplace = True)

print(s)

print('------')

#s.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

# value:填充值

# 注意inplace参数

df['value1'].fillna(method = 'pad',inplace = True)

print(df)

print('------')

# method参数:

# pad / ffill → 用之前的数据填充

# backfill / bfill → 用之后的数据填充

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('------')

# df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)

# to_replace → 被替换的值

# value → 替换值

s.replace([1,2,3],np.nan,inplace = True)

print(s)

# 多值用np.nan代替

4.缺失值插补

(1)均值/中位数/众数补插

s.fillna(u,inplace = True) u为均值;

# 缺失值插补

# 几种思路:均值/中位数/众数插补、临近值插补、插值法

# (1)均值/中位数/众数插补

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

#print(s)

print('------')

# 创建数据

u = s.mean() # 均值

me = s.median() # 中位数

mod = s.mode() # 众数

print('均值为:%.2f, 中位数为:%.2f' % (u,me))

print('众数为:', mod.tolist())

print('------')

# 分别求出均值/中位数/众数

s.fillna(u,inplace = True)

print(s)

# 用均值填补

(2)临近值插补

s.fillna(method = 'ffill',inplace = True) ffill用前值插入; bfill用后值插补;

# 缺失值插补

# 几种思路:均值/中位数/众数插补、临近值插补、插值法

# (2)临近值插补

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

#print(s)

print('------')

# 创建数据

s.fillna(method = 'ffill',inplace = True)

print(s)

# 用前值插补

(3)插值法---拉格朗日插值法

lagrange(x, y) --->> y = a0 * x**2 + a1 * x + a2 → y = -0.11111111 * x**2 + 0.33333333 * x + 10

# 缺失值插补

# 几种思路:均值/中位数/众数插补、临近值插补、插值法

# (3)插值法 —— 拉格朗日插值法

from scipy.interpolate import lagrange

x = [3, 6, 9]

y = [10, 8, 4]

plt.scatter(x, y)

print(lagrange(x, y)) #直接输出多项式的方程

# 的输出值为的是多项式的n个系数

# 这里输出3个值,分别为a0,a1,a2

# y = a0 * x**2 + a1 * x + a2 → y = -0.11111111 * x**2 + 0.33333333 * x + 10

print('插值10为:%.2f' % lagrange(x,y)(10))

print('------')

# -0.11111111*100 + 0.33333333*10 + 10 = -11.11111111 + 3.33333333 +10 = 2.22222222

用少数身边的临近值去推测这个值的本身,

df = pd.DataFrame({'x':np.arange(15)}) #创建一个数组

df['y'] = lagrange(x, y)(df['x']) #加一个y的标签

df

plt.plot(df['x'], df['y'], linestyle = '--', color = 'k')

data_na = data[data.isnull()] 缺失值数量;

print('缺失值数据量:%i' % len(data_na))

# 缺失值插补

# 几种思路:均值/中位数/众数插补、临近值插补、插值法

# (3)插值法 —— 拉格朗日插值法,实际运用

data = pd.Series(np.random.rand(100)*100)

data[3,6,33,56,45,66,67,80,90] = np.nan

print(data.head())

print('总数据量:%i' % len(data))

print('------')

# 创建数据

data_na = data[data.isnull()]

print('缺失值数据量:%i' % len(data_na))

print('缺失数据占比:%.2f%%' % (len(data_na) / len(data) * 100))

# 缺失值的数量

data_c = data.fillna(data.median()) # 中位数填充缺失值

fig,axes = plt.subplots(1,4,figsize = (20,5))

data.plot.box(ax = axes[0],grid = True,title = '数据分布') #直接生成图,做一个密度图会直接排除缺失值。

data.plot(kind = 'kde',style = '--r',ax = axes[1],grid = True,title ='删除缺失值',xlim = [-50,150])

data_c.plot(kind = 'kde',style = '--b',ax = axes[2],grid = True,title ='缺失值填充中位数',xlim = [-50,150])

# 密度图查看缺失值情况

def na_c(s,n,k=5): #5为位置

y = s[list(range(n-k,n+1+k))] # 取数

y = y[y.notnull()] # 剔除空值,把缺失值去掉,非缺失值筛选出来

return(lagrange(y.index,list(y))(n))

# 创建函数,做插值,由于数据量原因,以空值前后5个数据(共10个数据)为例做插值

na_re = []

for i in range(len(data)):

if data.isnull()[i]: #判断data里边的缺失值

data[i] = na_c(data,i)

print(na_c(data,i))

na_re.append(data[i])

data.dropna(inplace=True) # 清除插值后仍存在的缺失值

data.plot(kind = 'kde',style = '--k',ax = axes[3],grid = True,title = '拉格朗日插值后',xlim = [-50,150])

print('finished!')

# 缺失值插值

python缺失值处理 fillna_python 处理缺失值相关推荐

  1. python处理数据的优势-【Python数据分析基础】: 数据缺失值处理

    作者:xiaoyu 微信公众号:Python数据科学 圣人曾说过:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已. 再好的模型,如果没有好的数据和特征质量,那训练出来的效果也不会有所 ...

  2. 如何用python处理缺失值_用Python处理数据集中的缺失值

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 现实生活中的数据经常存在缺失值.产生缺失值的原因有很多,如观察资料未被记录.数据损坏等.由于很多机器学习算 ...

  3. Python科研数据分析专题之缺失值填补

    保姆级教程 | Python科研数据分析专题(三) 缺失值填补 提取出X2的非缺失的部分,即交易日数据 填补缺失值1:补0 填补缺失值2:用平均值填充 填补缺失值3:前向/后向填充 缺失值填补 Sim ...

  4. 【Python数据分析基础】: 数据缺失值处理

    再好的模型,如果没有好的数据和特征质量,那训练出来的效果也不会有所提高.数据质量对于数据分析而言是至关重要的,有时候它的意义会在某种程度上会胜过模型算法. 本篇开始分享如何使用Python进行数据分析 ...

  5. em模型补缺失值_模型对缺失值的处理

    模型对缺失值的处理 首先从两个角度解释你的困惑: 工具包自动处理数据缺失不代表具体的算法可以处理缺失项 对于有缺失的数据:以决策树为原型的模型优于依赖距离度量的模型 回答中也会介绍树模型,如随机森林 ...

  6. 【数据处理】python数据清洗通用手法:缺失值处理

    def missing_delete_var(df, threshold=None):"""df:数据集threshold:缺失率删除的阈值return :删除缺失后的数 ...

  7. python pandas缺失值处理_Pandas之缺失值处理

    原标题:Pandas之缺失值处理 本文作者:杨长青 本文编辑:周聪聪 技术总编:张学人 好消息!!!爬虫俱乐部将于2019年5月2日至4日在武汉举行Stata编程技术五一训练营,此次采用理论与案例相结 ...

  8. 【Python】np.where()替换缺失值

    使用Python做数据分析时经常需要替换缺失值. 1. np.where(条件,x,y)np.where函数的结果是,如果"条件"为真,则x,否则y.2.如下import pand ...

  9. python在winsorize中遇到缺失值的问题

    背景: 在数据的处理中需要winsorize,缩尾处理,python中有直接winsorize的命令但是出现了一些问题.特别是遇到缺失值的时候 问题描述 正常的winsorize应该是,最大值和90% ...

  10. python处理csv中的缺失值_Python中重复值、缺失值、空格值处理

    1.重复值处理 把数据结构中,行相同的数据只保留一行. 函数语法: drop_duplicates() 删除重复值newdf=df.drop_duplicates()from pandas impor ...

最新文章

  1. Jvm原理剖析与调优之内存结构
  2. spring依赖注入_Spring依赖注入
  3. sql建立到mysql的会话_SQLalchemy会话和多个数据库尝试创建twi索引
  4. 跨境电商ERP系统有几大功能?
  5. 20201219:力扣219周周赛题解
  6. springboot集成mongoDB 异常认证
  7. 如何使用键盘快捷键在Mac上录制屏幕?
  8. 【SQL精彩语句】按某一字段分组取最大(小)值所在行的数据
  9. GlobalMapper 脚本应用(持续更新)
  10. 计算机教学模式有待创新,计算机软件教学中教学评价模式的创新与探索
  11. 《众妙之门——自由网站设计师成功之道》一1.8 自由职业者的财务管理
  12. 金融业分布式数据库选型及HTAP场景实践
  13. android mini系统升级,iPad mini 4系统是什么?能升级安卓4.2吗?
  14. 用U盘给macbook 安装windows系统
  15. 阿里云CNAME配置详细图文流程 新手必看教程
  16. Office2007 Word 中出现乱码
  17. Centos 7.5利用LVM实现动态扩容大小
  18. 什么是 happens-before 原则?
  19. springboot+vue驾校管理系统 idea科目一四预约考试,练车
  20. 【HTML5 Canvas游戏开发】笔记(一) 概述和基础讲解

热门文章

  1. 计算机无纸化考试知识点,2012重庆无纸化考试《会计电算化》知识点:计算机软件...
  2. matlab canon,Canonical state-space realization
  3. 海康监控如何设置STMP邮箱报警
  4. UWP 学习笔记 二
  5. ABAP GOS 上传标准附件
  6. ES自动化集群搭建脚本shell
  7. 兼容微信字体变大,页面错乱问题
  8. “21天好习惯”第一期- 11 反爬虫机制详解(3)
  9. VMware安装win10 win2012(最详细最全操作)
  10. c语言折半查找递归程序,用递归法编写一个函数fac,求n!的值