【数据分析】缺失数据如何处理?pandas

news2024/11/15 19:44:52

本文目录

1. 基础概念

1.1. 缺失值分类

1.2. 缺失值处理方法

2. 缺失观测及其类型

2.1. 了解缺失信息

2.2. 三种缺失符号

2.3. Nullable类型与NA符号

2.4. NA的特性

2.5. convert_dtypes方法

3. 缺失数据的运算与分组

3.1. 加号与乘号规则

3.2. groupby方法中的缺失值

4. 填充与剔除

4.1. fillna方法

4.2. dropna方法

5. 插值

5.1. 线性插值

5.2. 高级插值方法

5.3. interpolate中的限制参数

  1. 基础概念

1.1缺失值的分类

按照数据缺失机制可分为:

  • 可忽略的缺失

  • 完全随机缺失(missing completely at random, MCAR),所缺失的数据发生的概率既与已观察到的数据无关,也与未观察到的数据无关

  • 随机缺失(missing at random, MAR),假设缺失数据发生的概率与所观察到的变量是有关的,而与未观察到的数据的特征是无关的。

  • 可忽略的缺失(non-ignorable missing ,NIM) 或非随机缺失(not missing at random, NMAR, or, missing not at random, MNAR),如果不完全变量中数据的缺失既依赖于完全变量又依赖于不完全变量本身,这种缺失即为不可忽略的缺失。

【注意】:Panda读取的数值型数据,缺失数据显示“NaN”(not a number)。

1.2数据值的处理方法

主要就是两种方法:

  • 删除存在缺失值的个案;

  • 缺失值插补。

【注意】缺失值的插补只能用于客观数据。由于主观数据受人的影响,其所涉及的真实值不能保证。

1、删除含有缺失值的个案(2种方法)

(1)简单删除法

简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。

(2)权重法

当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。

如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。

对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。

2、可能值插补缺失值

【思想来源】:以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。

(1)均值插补

属于单值插补。数据的属性分为定距型和非定距型。如果缺失值是定距型的,就以该属性存在值的平均值来插补缺失的值;如果缺失值是非定距型的,就用该属性的众数来补齐缺失的值。

(2)利用同类均值插补

属于单值插补。用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。

假设为信息完全的变量,为存在缺失值的变量,那么首先对或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。

如果在以后统计分析中还需以引入的解释变量和做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。

(3)极大似然估计(Max Likelihood ,ML)

缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。

这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。

该方法比删除个案和单值插补更有吸引力,前提是适用于大样本,有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂

(4)多重插补(Multiple Imputation,MI)

多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。

多重插补方法的三个步骤:

  • 为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。

  • 每个插补数据集合都用针对完整数据集的统计方法进行统计分析。

  • 对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

多重插补方法举例:

假设一组数据,包括三个变量,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失,C组缺失。在多值插补时,对A组将不进行任何处理,对B组产生的一组估计值(作关于,的回归),对C组作产生和的一组成对估计值(作,关于的回归)。

当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组的值,对C将利用 它们的联合分布为正态分布这一前提,估计出一组(,)。

上例中假定了的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。

多重插补弥补贝叶斯估计的不足之处:

  • 贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。

  • 贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系

  1. 缺失观测及其类型

首先导入数据:

import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()

2.1了解缺失信息

1、isna和notna方法

对Series使用会返回布尔列表

df['Physics'].isna().head()
df['Physics'].notna().head()
  1. 对DataFrame使用会返回布尔表

df.isna().head()

但对于DataFrame我们更关心到底每列有多少缺失值

df.isna().sum()

此外,可以通过第1章中介绍的info函数查看缺失信息

df.info()

2、查看缺失值的所以在行

以最后一列为例,挑出该列缺失值的行

df[df['Physics'].isna()]

3、挑选出所有非缺失值列

使用all就是全部非缺失值,如果是any就是至少有一个不是缺失值

df[df.notna().all(1)]
  1. 缺失数据的运算与分组

加号与乘号规则

使用加法时,缺失值为0

s = pd.Series([2,3,np.nan,4])s.sum()

9.0

使用乘法时,缺失值为1

s.prod()

24.0

使用累计函数时,缺失值自动略过

s.cumsum()
s.cumprod()
s.pct_change()

groupby方法中的缺失值

自动忽略为缺失值的组

df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})df_g
df_g.groupby('one').groups
  1. 填充与剔除‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

4.1 fillna方法

1、值填充与前后向填充(分别与ffill方法和bfill方法等价)

df['Physics'].fillna('missing').head()
df['Physics'].fillna(method='ffill').head()
df['Physics'].fillna(method='backfill').head()

2、填充中的对齐特性

df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})df_f.fillna(df_f.mean())

返回的结果中没有C,根据对齐特点不会被填充

df_f.fillna(df_f.mean()[['A','B']])

4.2 dropna方法

1、axis参数

df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})df_d
df_d.dropna(axis=0)
df_d.dropna(axis=1)

2、how参数(可以选all或者any,表示全为缺失去除和存在缺失去除)

df_d.dropna(axis=1,how='all')

3、subset参数(即在某一组列范围中搜索缺失值)¶

df_d.dropna(axis=0,subset=['B','C'])
  1. 插值

5.1线性插值

1、索引无关的线性插值

默认状态下,interpolate会对缺失的值进行线性插值

s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])s
s.interpolate()
s.interpolate().plot()

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7df20af50>

此时的插值与索引无关

s.index = np.sort(np.random.randint(50,300,8))s.interpolate()#值不变
s.interpolate().plot()#后面三个点不是线性的(如果几乎为线性函数,请重新运行上面的一个代码块,这是随机性导致的)

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dfc69890>

2、与索引有关的插值

method中的index和time选项可以使插值线性地依赖索引,即插值为索引的线性函数

s.interpolate(method='index').plot()#可以看到与上面的区别

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dca0c4d0>

如果索引是时间,那么可以按照时间长短插值,对于时间序列将在第9章详细介绍

s_t = pd.Series([0,np.nan,10]        ,index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')])s_t
s_t.interpolate().plot()

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc964850>

s_t.interpolate(method='time').plot()

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc8eda10>

5.2 高级插值方法

此处的高级指的是与线性插值相比较,例如样条插值、多项式插值、阿基玛插值等(需要安装Scipy)。

关于这部分仅给出一个官方的例子,因为插值方法是数值分析的内容,而不是Pandas中的基本知识:

ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])ser[missing] = np.nanmethods = ['linear', 'quadratic', 'cubic']df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods})df.plot()

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc86f810>

5.3 interpolate中的限制参数

1、limit表示最多插入多少个

s = pd.Series([1,np.nan,np.nan,np.nan,5])s.interpolate(limit=2)

2、limit_direction表示插值方向,可选forward,backward,both,默认前向。

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_direction='backward')

3、limit_area表示插值区域,可选inside,outside,默认None

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_area='inside')
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_area='outside')

声明:部分内容来源于网络,仅供读者学术交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是让ChatGPT爆火的大语言模型(LLM)

什么是让ChatGPT爆火的大语言模型(LLM) 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录什么是让ChatGPT爆火的大语言模型(LLM)大型语言模型有什么用&#xff1f;大型语言模型如何工作&#xff1f;大型语言模型的热门应用在哪里可以找到大型语言…

王道操作系统课代表 - 考研计算机 第一章 计算机概述 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “计算机概述” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全…

(五十七)插入数据时到底是如何维护好不同索引的B+树的?

之前我们已经给大家彻底分析清楚了MySQL数据库的索引结构了&#xff0c;大家都知道不同索引的结构是如何的&#xff0c;大致是如何建立的&#xff0c;然后搜索的时候是如何根据不同的索引去查找数据的。 那么今天我们来给大家彻底讲清楚&#xff0c;你在插入数据的时候&#x…

JavaSE学习笔记day17

零、 复习昨日 File: 通过路径代表一个文件或目录 方法: 创建型,查找类,判断类,其他 IO 输入& 输出字节&字符 try-catch代码 一、作业 给定路径删除该文件夹 public static void main(String[] args) {deleteDir(new File("E:\\A"));}// 删除文件夹public s…

openjdk:8镜像中安装工具命令的方法

文章目录前言一、获取openjdk:8环境1.下载并运行openjdk:82.获取当前镜像的基础环境信息3.更换源并安装软件二、更新Dockerfile1.增加命令2.尝试构建3.测试镜像是否可用总结前言 记录一下openjdk:8镜像安装命令的方法 同事使用openjdk:8作为基础镜像构建业务镜像&#xff0c;但…

蚂蚁CTO线五年测试开发,年后被优化,跟大家唠几句

夙兴夜寐&#xff0c;回顾从毕业出来到现在的这五年&#xff0c;也是在这里给大家抛砖引玉了。先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入蚂蚁金服&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一…

软件测试的主要工作内容是什么

平时说起程序员印象中大都是做Java、做前端、做后端&#xff0c;用着非常晦涩难懂的语言。在电脑前哐哐哐&#xff0c;没一会满屏代码显现出来。然而程序员并不全是印象中这样&#xff0c;还有一部分&#xff1a;他们不常写代码&#xff0c;主要去检查代码&#xff0c;是不是出…

人工智能前置研究-神经元/离子通道

专栏目录: 高质量文章导航_GZVIMMY的博客-CSDN博客 前言: 《生命是什么》:来自有序中的有序,非周期性晶体!有机体内在生命及其外部世界的相互作用,都能被精确的定律所概述,但前提是它自身必须有一个巨大结构,分子数目太少的话,定律也就不准确了。 《神秘的量子生命…

基于RT-Thread完整版搭建的极简Bootloader

项目背景Agile Upgrade: 用于快速构建 bootloader 的中间件。example 文件夹提供 PC 上的示例特性适配 RT-Thread 官方固件打包工具 (图形化工具及命令行工具)使用纯 C 开发&#xff0c;不涉及任何硬件接口&#xff0c;可在任何形式的硬件上直接使用加密、压缩支持如下&#xf…

Python抓取数据具体流程

之前看了一段有关爬虫的网课深有启发&#xff0c;于是自己也尝试着如如何过去爬虫百科“python”词条等相关页面的整个过程记录下来&#xff0c;方便后期其他人一起来学习。 抓取策略 确定目标&#xff1a;重要的是先确定需要抓取的网站具体的那些部分&#xff0c;下面实例是…

MySQL Buffer Pool 详解

1. Buffer Pool 概述 Buffer Pool 到底是什么&#xff1f;从字面上看是缓存池的意思&#xff0c;没错&#xff0c;它其实也就是缓存池的意思。它是MySQL当中至关重要的一个组件&#xff0c;可以这么说&#xff0c;MySQL的所有的增删改的操作都是在 Buffer Pool 中执行的。 但…

90%的人都不算会爬虫,这才是真正的技术,从0到高手的进阶

很多人以为学会了urlib模块和xpath等几个解析库&#xff0c;学了Selenium就会算精通爬虫了&#xff0c;但到外面想靠爬虫技术接点私活&#xff0c;才发现寸步难行。 龙叔我做了近20年的程序员&#xff0c;今天就告诉你&#xff0c;真正的爬虫高手应该学哪些东西&#xff0c;就…

相向双指针 leetcode 15 16 18 611

简单介绍 与同向双指针区别就是&#xff0c;同向查找的是子串最明显得区别就是两侧进行搜索比较快 基本得模板如下 while(left < right) {if( ){}else if(){}else{ // left与right得遍历while(){}} }具体以题目为例 两数之和比较简单 不展示了 leetcode 15 三数之和 这个…

NOC·核桃编程马拉松复赛低年级组 A 卷真题

1. 舞台区如下所示,角色足球的初始坐标为(0,0)。等待下图程序运行完毕后,足 球的坐标是多少?( ) A(100,100) B(-100,100) C(100,-100) D(0,0) 2. 亮亮设计了一个“击落陨石”的游戏。点击开始按钮后,陨石会出现在舞台区的随机位置,碰到炸弹后就会消失…

webrtc处理视频丢包的机制

1.摘要WebRTC是一个开源的实时交互式音频和视频通信框架。本文讨论了WebRTC中用于处理视频通信路径中数据包丢失的一些机制。讨论了各种系统细节&#xff0c;提出了一种基于时间层的自适应混合NACK/FEC方法。结果显示了该方法如何控制实时视频通信的质量权衡2.介绍WebRTC[1]是一…

特征工程——Tabular Data Features multimodal features

一、前言 机器学习时期&#xff0c;要花费大量的时间在特征设计上&#xff0c;好的输入数据可以让训练事半功倍。而有了深度学习后&#xff0c;神经网络可以自动实现特征提取&#xff0c;解放了手工(理论上是这样&#xff0c;实际也是要进行特征筛选的&#xff0c;因为在应用中…

小程序容器技术在微服务架构中的应用

随着移动互联网的发展&#xff0c;小程序已经成为了一种非常流行的应用方式&#xff0c;它可以在不安装任何应用的情况下&#xff0c;直接在移动终端设备&#xff08;如&#xff1a;App&#xff0c;iPad等&#xff09;中运行。微服务架构则是一种的分布式系统架构&#xff0c;可…

Ubuntu16.04 源码安装nginx

nginx源码包&#xff1a;http://nginx.org/download/ 目录1.可联网设备直接通过apt-get安装2.不可联网设备通过安装包编译和移植2.1 首先选择一台可联网的设备2.2 将编译好的文件夹拷贝到目标设备上问题&#xff1a;nginx启动 nginx: [emerg] bind() to 0.0.0.0:80 failed (98:…

机器学习100天(三十四):034 先验概率、条件概率

《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:先验概率、条件概率。 一、先验概率、条件概率 机器学习中,我们经常听到两个数学概念:先验概率、后验概率。抛开复杂数学公式不谈,我们通过一个实际的例子来帮助大家理解这两种概率。 最近天气炎热,红色石头…

问题三十四:傅立叶变换——高通滤波

高通滤波器是一种可以通过去除图像低频信息来增强高频信息的滤波器。在图像处理中&#xff0c;高通滤波器常常用于去除模糊或平滑效果&#xff0c;以及增强边缘或细节。在本篇回答中&#xff0c;我们将使用Python和OpenCV实现高通滤波器。 Step 1&#xff1a;加载图像并进行傅…