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.mfbz.cn/a/765342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arco disign vue 日期组件的样式穿透

问题描述: 对日期组件进行样式穿透. 原因分析: 如图,日期组件被展开时它默认将dom元素挂载到body下, 我们的页面在idroot的div 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…

收集了很久的全网好用的磁力搜索站列表分享

之前找资源的时候,收集了一波国内外大部分主流的磁力链接搜索站点。每一个站可能都有对应的优缺点,多试试,就能知道自己要哪个了。 全网好用的磁力链接 大部分的时候,我们用国内的就可以了,速度块,而且不…

Snappy使用

Snappy使用 Snappy是谷歌开源的压缩和解压的开发包,目标在于实现高速的压缩而不是最大的压缩 项目地址:GitHub - google/snappy:快速压缩器/解压缩器 Cmake版本升级 该项目需要比较新的cmake,CMake 3.16.3 or higher is requi…

51单片机第23步_定时器1工作在模式0(13位定时器)

重点学习51单片机定时器1工作在模式0的应用。 在51单片机中,定时器1工作在模式0,它和定时器0一样,TL1占低5位,TH1占高8位,合计13位,也是向上计数。 1、定时器1工作在模式0 1)、定时器1工作在模式0的框图…

8619 公约公倍

这个问题可以通过计算最大公约数 (GCD) 和最小公倍数 (LCM) 来解决。我们需要找到一个整数,它是 a, b, c 的 GCD 的倍数,同时也是 d, e, f 的 LCM 的约数。 以下是解决这个问题的步骤: 1. 计算 a, b, c 的最大公约数。 2. 计算 d, e, f 的最…

流处理系统对比:RisingWave vs ksqlDB

本文将从架构、部署与可扩展性、Source 和 Sink、生态系统与开发者工具几个方面比较 ksqlDB 和 RisingWave 这两款领先的流处理系统。 1. 架构 ksqlDB 是由 Confluent 开发和维护的流处理 SQL 引擎,专为 Apache Kafka 设计。它基于 Kafka Streams 构建,…

鸿蒙:路由Router原理

页面路由:在应用程序中实现不同页面之间的跳转和数据传递 典型应用:商品信息返回、订单等多页面跳转 页面栈最大容量为32个页面,当页面需要销毁可以使用router.clear()方法清空页面栈 router有两种页面跳转模式: router.pushUrl…

Golang 开发实战day15 - Input info

🏆个人专栏 🤺 leetcode 🧗 Leetcode Prime 🏇 Golang20天教程 🚴‍♂️ Java问题收集园地 🌴 成长感悟 欢迎大家观看,不执着于追求顶峰,只享受探索过程 Golang 开发实战day15 - 用户…

02归并排序——分治递归

02_归并排序_——分治_递归_ #include <stdio.h>void merge(int arr[], int l, int m, int r) {int n1 m -l 1;int n2 r -m;//创建临时数组int L[n1], R[n2];for(int i 0; i < n1; i){L[i] arr[l i];}for(int j 0; j < n2; j){R[j] arr[m 1 j];}int i …

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

ghost恢复?电脑文件恢复如何操作?电脑数据恢复工具!5款!

在数字化时代&#xff0c;电脑数据的价值日益凸显。然而&#xff0c;数据丢失、误删、系统崩溃等问题时有发生&#xff0c;给个人和企业带来巨大损失。本文将为您详细介绍Ghost恢复方法&#xff0c;同时推荐五款高效的电脑数据恢复工具&#xff0c;助您轻松应对数据丢失的困扰。…

DreamTech联合南大和牛津发布最强3D内容生成大模型——Direct3D

文章链接&#xff1a;https://arxiv.org/pdf/2405.14832 github链接&#xff1a;https://nju-3dv.github.io/projects/Direct3D/ 从文本和图像生成高质量的3D资产一直是一项挑战&#xff0c;主要是由于缺乏能够捕捉复杂几何分布的可扩展3D表示。在这项工作中&#xff0c;介绍…

7.x86游戏实战-C++实现跨进程读写-跨进程写内存

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;6.x86游戏实战-C实现跨进程读写-通过基址读取人物状态标志位 上一个内容通过基…

试用笔记之-汇通周易(易经)字典软件

首先下载汇通周易字典软件 汇通周易(易经)字典软件 http://www.htsoft.com.cn/download/htzhouyi.rar 解压安装后&#xff0c;桌面图标 双击这个汇通周易字典图标

【AHK V2】 定时刷新窗口中的控件内容

在AutoHotkey v2 中设计GUI窗口,窗口中有个文本框,可以定时刷新内容。 时间周期可以通过窗口中的 下拉框来设定。 /************************************************************************* @description * @file 控件自动更新.ahk* @author sunwind1576157* @date 2024…

【信息系统项目管理师】18年~23年案例概念型知识

文章目录 18上18下19上19下20上20下21上21下22年上22年下23年上 18上 请简述 ISO 9000 质量管理的原则 领导作用、 过程方法、 管理的系统方法、 与供方互利的关系、 基于事实的决策方法、 持续改进、 全员参与、 以顾客为关注焦点 概念 国家标准(GB/T 1 9000 2008)对质量的定…

如何在Python中实现一个简单的爬虫程序

如何在Python中实现一个简单的爬虫程序 随着互联网的发展&#xff0c;数据已成为当今社会最宝贵的资源之一。而爬虫程序则成为了获取互联网数据的重要工具之一。本文将介绍如何在Python中实现一个简单的爬虫程序&#xff0c;并提供具体的代码示例。 确定目标网站 在开始编写爬…

数组-移除元素

移除元素 移除元素&#xff08;leetcode27&#xff09; var removeElement function(nums, val) {const n nums.length;let left 0;for (let right 0; right < n; right) {if (nums[right] ! val) {nums[left] nums[right];left;}}return left; };删除有序数组中的重复…

236、二叉树的最近公共祖先

前提&#xff1a; 所有 Node.val 互不相同 。p ! qp 和 q 均存在于给定的二叉树中。 代码如下&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root q || root p || root NULL) return root;TreeN…

代码随想录第41天|动态规划

322. 零钱兑换 dp[j] : 最小硬币数量, j 为金额(相当于背包空间)递推公式 : dp[j] min(dp[j - coins[i]] 1, dp[j])初始化: 需要一个最大值, 避免覆盖, dp[0] 0遍历顺序: 钱币有序无序不影响, 因为求解最小个数, 结果相同(先遍历物品后背包, 先背包后物品都可) class Solut…