python之pandas中NaN与None的比较与处理

目录

(1)NaN与None比较

1.None 和 NaN 的区别

2.None 和 NaN创建示例

3.None 类型和数值类型运算会报错

4.判断是否为NaN或者None

用np.isnan()

用np.isnull()

(2)dataframe空值处理

1.将NaN变为指定值:df.fillna(value)

将空值变为指定值

前向填充和后向填充

使用fillna方法将NaN转换为零

使用replace方法将NaN转换为零

2.将None变为指定值

3.删除空值NaN:df.dropna()

4.是否为空值NaN或者None:df.isnull()

5.df.empty判断df是否存在数据

6.将类型为float的NaN变为int类型


(1)NaN与None比较

1.None 和 NaN 的区别

NaN是一个特殊的浮点数值,它表示缺失数据或不可用数据。在Pandas中,NaN表示一个缺失或无效的值,它是一个Python float对象。当我们在DataFrame中找到NaN时,我们通常希望使用其他值(如0)替换它,以便继续进行数据操作。

  • None 表示信息缺失,但其类型不是数字。 因此,任何包含 None 值的列(比如 Pandas Series)肯定不是数字类型,例如 int 或 float。
  • NaN 也表示数据缺失,是数字类型。 这意味着可以在 int 或 float 类型的数值列中找到 NaN。

2.None 和 NaN创建示例

a.用np.nan生成空缺数值

import numpy as np
import pandas as pd

x = pd.Series([1, np.nan])
print(x)
print(x[1])
print(type(x[1]))

运行结果

0    1.0
1    NaN
dtype: float64
nan
<class 'numpy.float64'>

b.创建None

在下面的代码中,创建了None值。

import pandas as pd

x = pd.Series(["1", None])
print(x)
print(x[1])
print(type(x[1]))

运行结果

0       1
1    None
dtype: object
None
<class 'NoneType'>

c.None自动转换为 NaN 值

在下面的测试中,None 值会自动转换为 NaN 值,因为该list中的其他数值是数字, Pandas 自动将 None 转换为 NaN。NaN类型对于很多算术操作来更简单,因此被优先考虑。

import pandas as pd
x = pd.Series([1, None])

print(x)
print(x[1])
print(type(x[1]))

运行结果

0    1.0
1    NaN
dtype: float64
nan
<class 'numpy.float64'>

3.None 类型和数值类型运算会报错

为什么我们说,使用 NaN 类型对于许多常用操作会更有利?

因为NaN对许多算术运算来说是合法的。 例如,下面涉及None的操作会报错:

None + 1

运行报错

---------------------------------------------------------------------------
 
TypeError                                 Traceback (most recent call last)
 
<ipython-input-8-3fd8740bf8ab> in <module>
----> 1 None + 1
 
 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

但如果是NaN类型,就不会报错。

import numpy as np

x = np.nan + 1
print(x)  # nan
print(x == np.nan)  # false
# 因为不能直接判断是否为nan,需要用相应函数

4.判断是否为NaN或者None

用np.isnan()

首先可以使用 numpy,函数 np.isnan() 可以检查一个值是否为 NaN 值,但它不适用于 None 值。

import numpy as np

ret = np.isnan(np.nan)
print(ret)  # True

# ret = np.isnan(None) 
# print(ret)  # True
# TypeError: ufunc 'isnan' not supported for the input types

用np.isnull()

另一方法, isnull() 可以用来检测缺失值, nan 或 None 都将为 True。

print(np.isnan(np.nan))  # True
print(pd.isnull(None))  # True

如果isnull()返回真,且isnan返回假,说明是None类型。

(2)dataframe空值处理

1.将NaN变为指定值:df.fillna(value)

将空值变为指定值

import pandas as pd
import numpy as np


data = pd.DataFrame({'Qu1': [np.nan, 3, 4, 3, 4],
                     'Qu2': [2, 3, 1, 2, 3],
                     'Qu3': [1, 5, 2, np.nan, np.nan]}, 
                    index = list('abcde'))
print(data)
#    Qu1  Qu2  Qu3
# a  NaN    2  1.0
# b  3.0    3  5.0
# c  4.0    1  2.0
# d  3.0    2  NaN
# e  4.0    3  NaN

data.fillna(999, inplace = True)
print(data)

前向填充和后向填充

DataFrame填充缺失值可以统一填充,也可以前向和后向填充:前向填充就是将空值填充为它上一个索引对应的值,如果是多个空值相连,则将这多个相连的空值填充为它们上面不为空值的那个值。

data.fillna(method='ffill', inplace = True)
print(data)
#    Qu1  Qu2  Qu3
# a  NaN    2  1.0
# b  3.0    3  5.0
# c  4.0    1  2.0
# d  3.0    2  2.0
# e  4.0    3  4.0

data.fillna(method='bfill', inplace = True)
print(data)

使用fillna方法将NaN转换为零

Pandas中的fillna方法可用于将NaN替换为指定的值。我们可以使用该方法将DataFrame中的NaN替换为零。以下是使用该方法的示例代码:

import pandas as pd

data = {'A': [1, 2, np.nan, 4],
        'B': [5, np.nan, 7, 8],
        'C': [9, 10, 11, np.nan]}

df = pd.DataFrame(data)
print(df)

df_filled = df.fillna(0)
print(df_filled)

输出:

   A    B     C
0  1.0  5.0   9.0
1  2.0  NaN  10.0
2  NaN  7.0  11.0
3  4.0  8.0   NaN

     A    B     C
0  1.0  5.0   9.0
1  2.0  0.0  10.0
2  0.0  7.0  11.0
3  4.0  8.0   0.0

如上所示,NaN值已被成功地替换为零

使用replace方法将NaN转换为零

除了使用fillna方法之外,我们还可以使用replace方法将NaN转换为零。

与fillna方法不同的是,replace方法还可以用于替换其他指定的值,而不仅仅是NaN。

以下是使用replace方法的示例代码:

import pandas as pd
import numpy as np

data = {'A': [1, 2, np.nan, 4],
        'B': [5, np.nan, 7, 8],
        'C': [9, 10, 11, np.nan]}

df = pd.DataFrame(data)
print(df)

df_filled = df.replace(np.nan, 0)
print(df_filled)

输出

   A    B     C
0  1.0  5.0   9.0
1  2.0  NaN  10.0
2  NaN  7.0  11.0
3  4.0  8.0   NaN

     A    B     C
0  1.0  5.0   9.0
1  2.0  0.0  10.0
2  0.0  7.0  11.0
3  4.0  8.0   0.0

2.将None变为指定值

import pandas as pd

df2 = pd.DataFrame(data=[[None, "x"], ["y", None], 
                         ["hello world"]], 
                   columns=["A", "B"])
print(df2)
'''
             A     B
0         None     x
1            y  None
2  hello world  None
'''

print(df2["A"][0])   # None
print(type(df2["A"][0]))  # <class 'NoneType'>

# 将为None的值变为"==="
ret = df2.applymap(lambda x: "===" if x is None else x)
print(ret)
'''
             A    B
0          ===    x
1            y  ===
2  hello world  ===
'''

3.删除空值NaN:df.dropna()

data = pd.DataFrame([[1,6.5,3],
                     [1,np.nan,np.nan],
                     [np.nan,np.nan,np.nan],
                     [np.nan,6.5,3]
                     ])
data.dropna()
#输出
#    0   1   2
#0   1.0 6.5 3.0

对DataFrame来说,dropna方法如果发现缺失值,就会进行整行删除

不过可以指定删除的方式,how=all,是当整行全是nan的时候才进行删除,同时还可以按指定的轴删除。

data.dropna(how='all',axis=1,inplace=True)
data
#输出
#    0   1   2
#0   1.0 6.5 3.0
#1   1.0 NaN NaN
#2   NaN NaN NaN
#3   NaN 6.5 3.0

还可以限制为指定的某些列存在空值时才删除整行数据

# 指定一些列中若含有空值,则去掉对应的行
all_column = ["name", "date", "time", "quantity"]
subset = all_column[1:-1]
df_trade.dropna(subset=subset, how='any', inplace=True)

剔除掉df类型数据某列数据中为空所在的行

data=data[pd.isnull(data['column_name'])==False]

4.是否为空值NaN或者None:df.isnull()

import pandas as pd
import numpy as np


data = pd.DataFrame({'Qu1': [np.nan, 3, 4, 3, 4],
                     'Qu2': [2, 3, 1, 2, 3],
                     'Qu3': [1, 5, 2, 4, np.nan]}, 
                    index = list('abcde'))
print(data)
#    Qu1  Qu2  Qu3
# a  NaN    2  1.0
# b  3.0    3  5.0
# c  4.0    1  2.0
# d  3.0    2  4.0
# e  4.0    3  NaN

result = data.isnull()
print(result)
#      Qu1    Qu2    Qu3
# a   True  False  False
# b  False  False  False
# c  False  False  False
# d  False  False  False
# e  False  False   True

判断df某一项的值是否为空

判断DataFrame中某一项的值是否为空的方法有两种:

1.通过pd.isnull()来判断,语法格式:

nan 或 None 都将为 True

import pandas as pd
 
pd.isnull(data.loc[i,'column_name'])
pd.isnull(data.loc[i,'column_name'])==True
if not pd.isnull(data.loc[i,'column_name']):
    pass

2.通过np.nan 来比较判断,语法格式:

nan将为 True

df['column_name'][i] is not np.nan

5.df.empty判断df是否存在数据

如果这个 DataFrame 只有列名,但是没有实际数据,会被 DataFrame.empty 判定为空

如果这个 DataFrame 仅由 缺失值 (NaN) 构成,不会被 DataFrame.empty 判定为空

import numpy as np
import pandas as pd


df1 = pd.DataFrame(data=None)
print(df1.empty)  # True

df2 = pd.DataFrame(data=[np.nan, np.nan])
print(df2)
'''
    0
0 NaN
1 NaN
'''
print(df2.empty)  # False


df3 = pd.DataFrame(data=[np.nan, 2])
print(df3.empty)  # False

6.将类型为float的NaN变为int类型

一个简单例子

df['A'] = df['A'].astype(int)

再一个例子,像在format函数中,用"06d"这类参数将整数类型格式化为指定格式的字符串时,元素只能是整数类型,当数据存在空值时会被加载为NaN值,如果其属于浮点数类型,则对NaN调用format函数时会报错

ValueError: Unknown format code 'd' for object of type 'float'

因此需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型

all_column = ["name", "date", "time", "quantity"]

# 指定一些列中若含有空值,则去掉对应的行
subset = all_column[1:-1]
df_trade.dropna(subset=subset, how='any', inplace=True)

# 浮点数类型转化为整数类型
for col in subset:
    df_trade[col] = df_trade[col].astype(int)

注意NaN为float类型时,.astype(int)转换,会发生错误

ValueError: cannot convert float NaN to integer

一个常见的替换值是0。您可以使用fillna()方法将所有NaNs替换为0,然后使用.astype(int)将该列转换为int类型。以下是一个示例代码:

df['A'] = df['A'].fillna(0).astype(int)

end

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

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

相关文章

嵌入式数据库SQLite 3配置使用详细笔记教程

0、惨痛教训 随着管理开发的项目体积越来越庞大&#xff0c;产品系统涉及的数据量也越来越多&#xff0c;并且伴随着项目不久就要交付给甲方了。如果项目的数据信息没有被妥善管理&#xff0c;后期设备的运行状态、操作状况等数据流信息不能被溯源&#xff0c;当出现了一些特殊…

【35分钟掌握金融风控策略16】贷前风控策略详解-1

目录 贷前风控策略详解 贷前风控目标 精准审核申请贷款客户资质 对申请贷款客户进行合理定额 对申请贷款客户进行合理定价 推动实现利润最大化 贷前风控数据源 客户贷款时提供的数据 贷前风控策略详解 俗话说&#xff0c;良好的开端是成功的一半&#xff0c;而贷前是风…

C++新手村指南:入门基础

目录 C概念 C发展史 C关键字&#xff08;C98&#xff09; 命名空间 命名空间的定义 命名空间的使用 C中的输入&&输出 缺省参数 缺省参数的概念 缺省参数的分类 函数重载 函数重载概念 函数重载实现 引用 引用的概念 引用的特性 常引用 引用的使用场景…

基于单片机的小型自动浇灌系统设计

摘 要:以单片机为主控芯片,结合传感器和计算机,搭建了一套智能化的浇灌系统;利用LabVIEW 设计并编写了基于状态机程序架构的上位机软件,实现了友好的用户交互界面,实时测量、显示与记录等功能,并由主控芯片进行浇灌。经测试,本系统具有结构简单,研制成本低,运…

详细介绍一下PointPillars算法的网络结构

PointPillars是一种用于3D目标检测的算法&#xff0c;它主要使用了点云数据和深度学习模型。 PointPillars算法的网络结构主要可以分为三个主要阶段&#xff1a; Pillar Feature Net&#xff08;点云特征处理网络&#xff09;&#xff1a;此阶段的主要任务是将输入的点云数据转…

回答篇:测试开发高频面试题目

引用之前文章&#xff1a;《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…

Java:Servlet详解

目录 一、什么是Servlet 二、Servlet原理 Servlet的生命周期 三、 Servlet注释 WebServlet 一、什么是Servlet Servlet是JavaWeb开发的一种技术&#xff0c;Servlet程序需要部署在Servlet容器&#xff08;服务端&#xff09;中才能运行&#xff0c;常见的Servlet容器有Tom…

【C++】环境搭建CentOS Clion报错Unsupported git Version 1.8.3.1

【C】环境搭建Clion-Unsupported git Version 1.8.3.1 Git升级步骤1.卸载旧版本2.安装依赖3.下载git最新版本包4.解压git文件包5.编译文件5.将git加入环境变量6.验证git版本 如上图所示&#xff0c;报错Unsupported git Version 1.8.3.1 At least 2.17.0 is required 报错意思…

windows驱动开发-inf文件(一)

驱动总是和inf文件相关&#xff0c;在WinDDK的时候&#xff0c;许多inf文件都需要开发工程师手动编写&#xff0c;不过&#xff0c;现在已经可以使用inx文件来生成inf文件了&#xff0c;它经常用于驱动的安装和卸载&#xff1b;不过&#xff0c;并不是所有的驱动都需要使用inf文…

小白修复msvcp140.dll丢失的解决方法,一键修复丢失的dll文件

在我们使用电脑时&#xff0c;常常会碰到各种烦人的状况。比方说&#xff0c;当我们期待畅玩游戏时&#xff0c;可能会突然遭遇一则令人沮丧的提示&#xff1a;“打开游戏缺少msvcp140.dll文件”。这个问题会给我们带来困扰和不愉快&#xff0c;但庆幸的是&#xff0c;有多种解…

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题&#xff1a; 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件&#xff0c;设置浮力点&#xff0c;应用水中牵引力。 4、最重要的是需要激活——自动启用。 5、调水波长的地方 双击图片…

【JavaScript】内置对象 - Date 日期对象 ④ ( 制作倒计时页面 )

文章目录 一、倒计时页面实现1、需求分析2、计算秒数3、计算倒计时时间的 天 / 时 / 分 / 秒4、页面中显示倒计时时间 二、完整代码示例1、完整代码2、执行结果 Date 日期对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Da…

北京大学肖臻老师《区块链技术与应用》P16(状态树)和P17(交易树和收据树)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P16 - ETH状态树篇P17 - ETH交易树和收据树篇 部分文字和图片 北京大学肖臻老师《区块链技术与应用》公开课笔记18——ETH数据结构篇2(状态树2)北京大学肖臻老师《区块链技术与应用》公开课笔记19——ETH数据结构篇3(交易树和…

入门视频剪辑:视频合并不再难,批量嵌套合并的简单步骤

在数字媒体时代&#xff0c;视频剪辑已成为一项基本技能。无论是制作家庭电影、公司宣传片还是在线教育内容&#xff0c;视频剪辑都扮演着重要角色。对于初学者来说&#xff0c;视频剪辑可能看起来有些复杂&#xff0c;但掌握了正确的步骤和技巧后&#xff0c;你会发现它其实并…

Angular中的路由

Angular中的路由 文章目录 Angular中的路由前言一、创建路由二、创建多个组件路由三、创建子路由四、创建多个组件子路由 前言 在Angular中&#xff0c;路由是用于在不同的视图和组件之间导航的机制。Angular提供了一种强大的路由机制来管理单页应用&#xff08;SPA&#xff0…

十九、分布式数据库MyCat

目录 一、概述 1、MyCat是什么&#xff1f; 2、原理&#xff1a; 3、能干什么 1、读写分离 2、数据分片 3、多数据源整合 4、Mycat监控 4、安装部署 1、环境准备 2、安装 3、Mycat配置详解 1、server.xml user 标签 2、schema.xml schema标签&#xff1a; table标签&…

实践遥感卫星场景海洋船只检测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建卫星遥感场景下海洋海面船只检测识别系统

遥感相关的实践在我们前面的系列博文中也有相关的一些实践&#xff0c;胡药师基于MASTAR数据集开发构建对应的目标检测系统在前文也有一些介绍&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于YOLOv7开发构建MSTAR雷达影像目标检测系统》 《基于yolov5n的轻量…

多角度解析动态住宅IP的多元化应用

动态住宅IP指的是在住宅网络中使用的、能够随时间或用户需求配置的IP地址&#xff0c;能够根据网络状况自动调整&#xff0c;为用户提供更加灵活、高效的上网体验。这种IP地址不是固定不变的&#xff0c;而是会定期自动更换&#xff0c;这种IP地址也让使用者的安全得以保障。 作…

【牛客】【模板】前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和模板题。 前缀和中数组下标为1~n。 前缀和&#xff1a;pre[i]pre[i-1]a[i]; 某段区间 [l,r]的和&#xff1a;pre[r]-pre[l-1] 3.…

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论&#xff0c;求二维梁的固有频率和振型。短边固定&#xff0c;给定长度、横截面积&#xff0c;弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通&#xff0c;可直接运行。 247 梁的振型仿真 固有频率…
最新文章