17-Pandas缺失值处理

Python Pandas缺失值处理

在一些数据分析业务中,数据缺失是我们经常遇见的问题,缺失值会导致数据质量的下降,从而影响模型预测的准确性,这对于机器学习和数据挖掘影响尤为严重。因此妥善的处理缺失值能够使模型预测更为准确和有效。

为什么会存在缺失值?

前面章节的示例中,我们遇到过很多 NaN 值,关于缺失值您可能会有很多疑问,数据为什么会丢失数据呢,又是从什么时候丢失的呢?通过下面场景,您会得到答案。

其实在很多时候,人们往往不愿意过多透露自己的信息。假如您正在对用户的产品体验做调查,在这个过程中您会发现,一些用户很乐意分享自己使用产品的体验,但他是不愿意透露自己的姓名和联系方式;还有一些用户愿意分享他们使用产品的全部经过,包括自己的姓名和联系方式。因此,总有一些数据会因为某些不可抗力的因素丢失,这种情况在现实生活中会经常遇到。

什么是稀疏数据?

稀疏数据,指的是在数据库或者数据集中存在大量缺失数据或者空值,我们把这样的数据集称为稀疏数据集。稀疏数据不是无效数据,只不过是信息不全而已,只要通过适当的方法就可以“变废为宝”。

稀疏数据的来源与产生原因有很多种,大致归为以下几种:

  • 由于调查不当产生的稀疏数据;
  • 由于天然限制产生的稀疏数据;
  • 文本挖掘中产生的稀疏数据。

缺失值处理

那么 Pandas 是如何处理缺失值的呢,下面让我们一起看一下。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df)

输出结果:

          0         1         2
a  1.659217 -0.522622  0.004241
b       NaN       NaN       NaN
c  0.788436 -1.135235 -1.753622
d       NaN       NaN       NaN
e  0.144724 -0.307758 -0.435239
f -0.807119  1.932682 -0.684306
g       NaN       NaN       NaN
h -0.026587 -0.732601  0.204647

上述示例,通过使用 reindex(重构索引),我们创建了一个存在缺少值的 DataFrame 对象。

检查缺失值

为了使检测缺失值变得更容易,Pandas 提供了 isnull() 和 notnull() 两个函数,它们同时适用于 Series 和 DataFrame 对象。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print("原始数据:\n",df)
print("判断数据是否为空:\n",df[[1,2]].isnull())

输出结果:

原始数据:0         1         2
a  0.232274  0.049742 -1.196369
b       NaN       NaN       NaN
c -0.598790  0.731822  0.898254
d       NaN       NaN       NaN
e -1.728575 -0.669052 -0.454844
f  0.739184  1.352023  0.061043
g       NaN       NaN       NaN
h  1.305116  0.578419  0.021779
判断数据是否为空:1      2
a  False  False
b   True   True
c  False  False
d   True   True
e  False  False
f  False  False
g   True   True
h  False  False

notnull() 函数,使用示例:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print("原始数据:\n",df)
print("判断数据是否不为空:\n",df[[1,2]].notnull())

输出结果:

原始数据:0         1         2
a -0.213029  0.466790  0.632789
b       NaN       NaN       NaN
c  0.091104  0.674106  0.396130
d       NaN       NaN       NaN
e -0.304249 -0.098976 -0.627985
f -1.390221 -0.592548 -0.539891
g       NaN       NaN       NaN
h  0.624527  0.278154  1.006981
判断数据是否不为空:1      2
a   True   True
b  False  False
c   True   True
d  False  False
e   True   True
f   True   True
g  False  False
h   True   True

缺失数据计算

计算缺失数据时,需要注意两点:首先数据求和时,将 NA 值视为 0 ,其次,如果要计算的数据为 NA,那么结果就是 NA。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(5,3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df)
print ("列one的和为:",df['one'].sum())

输出结果:

    one   two  three
a   0.0   1.0    2.0
b   NaN   NaN    NaN
c   3.0   4.0    5.0
d   NaN   NaN    NaN
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   NaN   NaN    NaN
h  12.0  13.0   14.0
列one的和为: 30.0

清理并填充缺失值

Pandas 提供了多种方法来清除缺失值。fillna() 函数可以实现用非空数据“填充”NaN 值。

1) 用标量值替换NaN值

下列程序将 NaN 值 替换为了 0,如下所示:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(5,3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print("原始数据:\n",df)
print("使用0填充NaN:\n",df.fillna(0))

输出结果:

原始数据:one   two  three
a   0.0   1.0    2.0
b   NaN   NaN    NaN
c   3.0   4.0    5.0
d   NaN   NaN    NaN
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   NaN   NaN    NaN
h  12.0  13.0   14.0
使用0填充NaN:one   two  three
a   0.0   1.0    2.0
b   0.0   0.0    0.0
c   3.0   4.0    5.0
d   0.0   0.0    0.0
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   0.0   0.0    0.0
h  12.0  13.0   14.

当然根据您自己的需求,您也可以用其他值进行填充。

2) 向前和向后填充NA

示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(5,3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print("原始数据:\n",df)
print("向后填充:\n",df.fillna(method='ffill'))
print("向前填充:\n",df.fillna(method='bfill'))

输出结果:

原始数据:one   two  three
a   0.0   1.0    2.0
b   NaN   NaN    NaN
c   3.0   4.0    5.0
d   NaN   NaN    NaN
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   NaN   NaN    NaN
h  12.0  13.0   14.0
向后填充:one   two  three
a   0.0   1.0    2.0
b   0.0   1.0    2.0
c   3.0   4.0    5.0
d   3.0   4.0    5.0
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   9.0  10.0   11.0
h  12.0  13.0   14.0
向前填充:one   two  three
a   0.0   1.0    2.0
b   3.0   4.0    5.0
c   3.0   4.0    5.0
d   6.0   7.0    8.0
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g  12.0  13.0   14.0
h  12.0  13.0   14.0
3) 使用replace替换通用值

在某些情况下,您需要使用 replace() 将 DataFrame 中的通用值替换成特定值,这和使用 fillna() 函数替换 NaN 值是类似的。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(5,3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print("原始数据:\n",df)
print("替换后的数据:\n",df.replace({np.nan:0}))

输出结果:

原始数据:one   two  three
a   0.0   1.0    2.0
b   NaN   NaN    NaN
c   3.0   4.0    5.0
d   NaN   NaN    NaN
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   NaN   NaN    NaN
h  12.0  13.0   14.0
替换后的数据:one   two  three
a   0.0   1.0    2.0
b   0.0   0.0    0.0
c   3.0   4.0    5.0
d   0.0   0.0    0.0
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   0.0   0.0    0.0
h  12.0  13.0   14.0

删除缺失值

如果想删除缺失值,那么使用 dropna() 函数与参数 axis 可以实现。在默认情况下,按照 axis=0 来按行处理,这意味着如果某一行中存在 NaN 值将会删除整行数据。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(5,3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print("原始数据:\n",df)
print("删除后的数据:\n",df.dropna())

输出结果:

原始数据:one   two  three
a   0.0   1.0    2.0
b   NaN   NaN    NaN
c   3.0   4.0    5.0
d   NaN   NaN    NaN
e   6.0   7.0    8.0
f   9.0  10.0   11.0
g   NaN   NaN    NaN
h  12.0  13.0   14.0
删除后的数据:one   two  three
a   0.0   1.0    2.0
c   3.0   4.0    5.0
e   6.0   7.0    8.0
f   9.0  10.0   11.0
h  12.0  13.0   14.0

axis = 1 表示按列处理,处理结果是一个空的 DataFrame 对象。

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

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

相关文章

20240627构造专题

写在前面:出场即巅峰(明日模拟赛RP) 一.何为构造 就是通过对一道题题面的分析可以发现某种规律(类似于不完全归纳法),然后发掘本质,就可以很快的解题,但是显然我还没有掌握 二.一…

基于星火大模型的群聊对话分角色要素提取挑战赛Task1笔记

基于星火大模型的群聊对话分角色要素提取挑战赛Task1笔记 跑通baseline 1、安装依赖 下载相应的数据库 !pip install --upgrade -q spark_ai_python2、配置导入 导入必要的包。 from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler from sparkai.core.messages…

JAVA基础教程DAY2-类的构造方法及类的实例化调用

下面我们来讲如何建好类以及如何将它实例化 首先建立一个学生类Student,里面要求有属性,学号、年龄为int型,姓名,方法有学习study 在Student.java文件当中,我们完成以上代码为 public class Student {int age17;in…

【JS】期末复习题

一、选择题 1&#xff0e;下面四种标签哪种写法不正确&#xff08; D &#xff09;。 A&#xff0e;<html></html> B&#xff0e;<Html></Html> C&#xff0e;<HTML></HTML> D&#xff0e;<html><h…

React基础与核心概念探索

目录 React简介 起源与设计理念 JSX语法 什么是JSX&#xff1f; 为什么使用JSX&#xff1f; JSX的转换过程 组件化架构 React组件的概念 分类&#xff1a;函数组件 vs 类组件 状态管理 Props传递 虚拟DOM 高效DOM更新的秘密 工作原理 React简介 起源与设计理念 React&…

操作系统大题复习

磁盘调度算法 一次磁盘读写需要的时间 寻道时间 先来先服务FCFS 优点&#xff1a;公平 缺点&#xff1a;性能差&#xff0c;寻道时间长 最短寻道时间有限SSTF 缺点&#xff1a;可能产生饥饿现象 扫描算法SCAN 优点&#xff1a;不会产生饥饿现象 缺点&#xff1a;响应频率…

Node.js学习(一)

Node.js安装与入门案例&#xff1a; 需求&#xff1a;点击按钮&#xff0c;请求本地目录指定文件的内容&#xff0c;并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了&#xff0c;可是会发现不行。 网页运行在浏览器端&#xff0c;通常后续要发布&#xf…

docker部署wg-easy和firefly

Background WireGuard是一种新型的VPN协议,它通过在内核层运行,提供高效、安全、简单和现代的VPN解决方案。wg-easy是一个专为简化 WireGuard VPN配置和管理而设计的工具&#xff0c;提供了界面化的管理&#xff0c;进一步降低WireGuard 的使用门槛&#xff0c;让用户无需深入了…

在Linux中对Nginx配置rewrite跳转

nginx安装在IP为x.x.x.x的服务器上 rewrite语法&#xff1a; rewrite <正则表达式> <指定替换的内容> <flag标记> 注释&#xff1a;使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标记位&#xff08;redirect返回302临时重定向…

css_23_多列布局

常用值&#xff1a; column-count&#xff1a;指定列数&#xff0c;值是数字。 column-width&#xff1a;指定列宽&#xff0c;值是长度。 columns &#xff1a;同时指定列宽和列数&#xff0c;复合属性&#xff1b;值没有数量和顺序要求。 column-gap&#xff1a;设置列边距…

Java时间转换

一、线程不安全 Date date new Date(); SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String prefix dateFormat.format(date);二、线程安全,建议使用 String t1 LocalDateTime.now().format(DateTimeFormatter.ofPattern("y…

【C++】STL-stack_queue

目录 1、stack和queue的使用 1.1 最小栈 1.2 栈的弹出和压入序列 1.3 二叉树的层序遍历 2、stack和queue的模拟实现 2.1 适配器 2.2 deque 2.2.1 deque的成员变量 2.2.2 deque的迭代器 2.2.3 deque尾插元素 2.2.4 deque头插元素 2.2.5 下标访问 2.2.6 deque的不足 …

Transformer模型学习

Transformer模型是深度学习领域的一种创新架构&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;任务中表现出色。它是由Vaswani等人在2017年的论文《Attention is All You Need》中首次提出的。以下是对Transformer模型的详细介绍&#xff1a; Transformer的起源和…

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库&#xff0c;这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念&#xff1a;用户属于部门&#xff0c;部门拥有 角色&#xff0c;则又多了一层&#xff1a; user-…

力扣刷题--3158. 求出出现两次数字的 XOR 值【简单】

题目描述 给你一个数组 nums &#xff0c;数组中的数字 要么 出现一次&#xff0c;要么 出现两次。 请你返回数组中所有出现两次数字的按位 XOR 值&#xff0c;如果没有数字出现过两次&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,1,3] 输出&…

数据加密解密和哈希的解析

[S1301]数据的加解密 对提供的原始数据&#xff08;字符串或者二进制数组&#xff09;进行加密是数据保护框架体提供的基本功能&#xff0c;接下来我们利用一个简单的控制台程序来演示一下加解密如何实现。数据的加解密均由IDataProtector对象来完成&#xff0c;而该对象由IDa…

Linux硬链接和软链接(符号链接)

ln 是 Linux 和 Unix 系统中用来创建链接的命令。它的基本用法如下&#xff1a; 创建硬链接&#xff1a; ln source_file target_link这会创建一个名为 target_link 的硬链接&#xff0c;指向 source_file。硬链接实际上是文件系统中的一个额外条目&#xff0c;指向相同的数据块…

Elasticsearch:Runtime fields - 运行时字段(一)

运行时字段&#xff08;runtime fields&#xff09;是在查询时计算的字段。运行时字段使你能够&#xff1a; 向现有文档添加字段而无需重新索引数据开始处理数据而无需了解其结构在查询时覆盖索引字段返回的值定义用于特定用途的字段而无需修改底层架构 你可以像访问其他任何…

bash条件判断基础adsawq1`1nn

判断的作用 判断后续操作的提前条件是否满足如果满足执行一种命令不满足则执行另一种指令 条件测试类型&#xff1a; 整型测试字符测试文字测试 整数测试&#xff1a;比较两个整数谁大谁小&#xff0c;是否相等&#xff1b; 二元测试&#xff1a; num1 操作符 num2 -eq: 等于…

uniapp封装虚拟列表滚动组件

uniapp封装虚拟列表滚动组件 这里用到一个列表&#xff0c;然后数据可能有很多很多…&#xff0c;一次性全部渲染到dom上会卡顿&#xff0c;很废性能&#xff0c;于是用了这个虚拟列表就变丝滑很多很多。 组件mosoweInventedList 代码&#xff1a; <!-- 虚拟滚动列表组件&a…