python缺失值处理 fillna_python 处理缺失值
数据缺失主要包括记录缺失和字段信息缺失等情况,其对数据分析会有较大影响,导致结果不确定性更加显著
缺失值的处理:删除记录 / 数据插补 / 不处理
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 处理缺失值相关推荐
- python处理数据的优势-【Python数据分析基础】: 数据缺失值处理
作者:xiaoyu 微信公众号:Python数据科学 圣人曾说过:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已. 再好的模型,如果没有好的数据和特征质量,那训练出来的效果也不会有所 ...
- 如何用python处理缺失值_用Python处理数据集中的缺失值
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 现实生活中的数据经常存在缺失值.产生缺失值的原因有很多,如观察资料未被记录.数据损坏等.由于很多机器学习算 ...
- Python科研数据分析专题之缺失值填补
保姆级教程 | Python科研数据分析专题(三) 缺失值填补 提取出X2的非缺失的部分,即交易日数据 填补缺失值1:补0 填补缺失值2:用平均值填充 填补缺失值3:前向/后向填充 缺失值填补 Sim ...
- 【Python数据分析基础】: 数据缺失值处理
再好的模型,如果没有好的数据和特征质量,那训练出来的效果也不会有所提高.数据质量对于数据分析而言是至关重要的,有时候它的意义会在某种程度上会胜过模型算法. 本篇开始分享如何使用Python进行数据分析 ...
- em模型补缺失值_模型对缺失值的处理
模型对缺失值的处理 首先从两个角度解释你的困惑: 工具包自动处理数据缺失不代表具体的算法可以处理缺失项 对于有缺失的数据:以决策树为原型的模型优于依赖距离度量的模型 回答中也会介绍树模型,如随机森林 ...
- 【数据处理】python数据清洗通用手法:缺失值处理
def missing_delete_var(df, threshold=None):"""df:数据集threshold:缺失率删除的阈值return :删除缺失后的数 ...
- python pandas缺失值处理_Pandas之缺失值处理
原标题:Pandas之缺失值处理 本文作者:杨长青 本文编辑:周聪聪 技术总编:张学人 好消息!!!爬虫俱乐部将于2019年5月2日至4日在武汉举行Stata编程技术五一训练营,此次采用理论与案例相结 ...
- 【Python】np.where()替换缺失值
使用Python做数据分析时经常需要替换缺失值. 1. np.where(条件,x,y)np.where函数的结果是,如果"条件"为真,则x,否则y.2.如下import pand ...
- python在winsorize中遇到缺失值的问题
背景: 在数据的处理中需要winsorize,缩尾处理,python中有直接winsorize的命令但是出现了一些问题.特别是遇到缺失值的时候 问题描述 正常的winsorize应该是,最大值和90% ...
- python处理csv中的缺失值_Python中重复值、缺失值、空格值处理
1.重复值处理 把数据结构中,行相同的数据只保留一行. 函数语法: drop_duplicates() 删除重复值newdf=df.drop_duplicates()from pandas impor ...
最新文章
- Jvm原理剖析与调优之内存结构
- spring依赖注入_Spring依赖注入
- sql建立到mysql的会话_SQLalchemy会话和多个数据库尝试创建twi索引
- 跨境电商ERP系统有几大功能?
- 20201219:力扣219周周赛题解
- springboot集成mongoDB 异常认证
- 如何使用键盘快捷键在Mac上录制屏幕?
- 【SQL精彩语句】按某一字段分组取最大(小)值所在行的数据
- GlobalMapper 脚本应用(持续更新)
- 计算机教学模式有待创新,计算机软件教学中教学评价模式的创新与探索
- 《众妙之门——自由网站设计师成功之道》一1.8 自由职业者的财务管理
- 金融业分布式数据库选型及HTAP场景实践
- android mini系统升级,iPad mini 4系统是什么?能升级安卓4.2吗?
- 用U盘给macbook 安装windows系统
- 阿里云CNAME配置详细图文流程 新手必看教程
- Office2007 Word 中出现乱码
- Centos 7.5利用LVM实现动态扩容大小
- 什么是 happens-before 原则?
- springboot+vue驾校管理系统 idea科目一四预约考试,练车
- 【HTML5 Canvas游戏开发】笔记(一) 概述和基础讲解
热门文章
- 计算机无纸化考试知识点,2012重庆无纸化考试《会计电算化》知识点:计算机软件...
- matlab canon,Canonical state-space realization
- 海康监控如何设置STMP邮箱报警
- UWP 学习笔记 二
- ABAP GOS 上传标准附件
- ES自动化集群搭建脚本shell
- 兼容微信字体变大,页面错乱问题
- “21天好习惯”第一期- 11 反爬虫机制详解(3)
- VMware安装win10 win2012(最详细最全操作)
- c语言折半查找递归程序,用递归法编写一个函数fac,求n!的值