pandas基于numpy,所以其中的空值nan和numpy.nan是等价的。numpy中的nan并不是空对象,其实际上是numpy.float64对象,所以我们不能误认为其是空对象,从而用bool(np.nan)去判断是否为空值,这是不对的。

一、怎么判断

对于pandas中的空值,我们该如何判断,并且有哪些我们容易掉进去的陷阱,即不能用怎么样的方式去判断呢?

1、可以判断pandas中单个空值对象的方式:

- 利用pd.isnull(),pd.isna();

- 利用np.isnan();

- 利用is表达式;

- 利用in表达式

- 使用math库的isnan函数

2、不可以用来判断pandas单个空值对象的方式:

- 不可直接用==表达式判断;

- 不可直接用bool表达式判断;

- 不可直接用if语句判断。

3、对于同时多个空值对象的判断和处理:

- 可以用Series对象和DataFrame对象的any()或all()方法;

- 可以用numpy的any()或all()方法;

- 不可以直接用python的内置函数any()和all()方法;

- 可以用Series或DataFrame对象的dropna()方法剔除空值;

- 可以用Series或DataFrame对象的fillna()方法填充空值。

二、示例:

>>> import pandas as pd

>>> import numpy as np

>>> from math import isnan

>>> na=np.nan

>>> # 可以用来判断空值的方式

...

>>> pd.isnull(na)

True

>>> pd.isna(na)

True

>>> np.isnan(na)

True

>>> na is np.nan

True

>>> na in [np.nan]

True

>>> isnan(na)

True

>>> # 可以用来判断非空的方式

>>> pd.notnull(na)

False

>>> pd.notna(na)

False

>>> ~np.isnan(na) # 这种小数据量可以,大数据量就报错https://itdiandi.net/view/2874

False

>>> # 不可以直接用来判断的方式,即以下结果和我们预期不一样

...

>>> na == np.nan

False

>>> bool(na)

True

>>> if na:

... print('na is not null')

...

na is not null

>>> # 不可以直接用python内置函数any和all

...

>>> any([na])

True

>>> all(

Querying for NaN and other names in Pandas

In general, you could use @local_variable_name, so something like

>>> pi = np.pi; nan = np.nan

>>> df = pd.DataFrame({"value": [3,4,9,10,11,np.nan,12]})

>>> df.query("(value < 10) and (value > @pi)")

value

1      4

2      9

would work, but nan isn't equal to itself, so value == NaN will always be false. One way to hack around this is to use that fact, and use value != value as an isnan check. We have

>>> df.query("(value < 10) or (value == @nan)")

value

0      3

1      4

2      9

According to this answer you can use:

df.query('value < 10 | value.isnull()', engine='python')

import pandas as pd

import numpy as np

df = pd.DataFrame({'value': [3, 4, 9, 10, 11, np.nan, 12]})

available = df.query("value.notna()")

print(available)

9

You can use the isna and notna Series methods, which is concise and readable.

import pandas as pd

import numpy as np

df = pd.DataFrame({'value': [3, 4, 9, 10, 11, np.nan, 12]})

available = df.query("value.notna()")

print(available)

#    value

# 0    3.0

# 1    4.0

# 2    9.0

# 3   10.0

# 4   11.0

# 6   12.0

not_available = df.query("value.isna()")

print(not_available)

#    value

# 5    NaN

Alternatively, you can use the toplevel pd.isna function, by referencing it as a local variable.

import pandas as pd

import numpy as np

df = pd.DataFrame({'value': [3, 4, 9, 10, 11, np.nan, 12]})

df.query("@pd.isna(value)")

#    value

# 5    NaN

https://stackoverflow.com/questions/26535563/querying-for-nan-and-other-names-in-pandas

三、总结

numpy.nan是一个numpy.float64的非空对象,所以不能直接用bool表达式去判断,故一切依赖于布尔表达式的判断方式都不行,比如if语句。对于pandas中空值的判断,我们只能通过pandas或者numpy的函数和is表达式去判断,不能用python的内置函数any或all判断。

比较奇怪的一点是pandas中空值的判断可以用is表达式判断,但是不能用==表达式判断。我们知道,对于is表达式,如果返回True,表示这两个引用指向的是同一个内存对象,即内存地址是一样的,一般同一个对象的不同引用的值也应该是相等的,所以一般is表达式为True,那么==表达式也为True。但是对于numpy.nan对象显然不是这样的,因为其可以用is表达式判断,即当is表达式为True时,但==表达式为False,这说明虽然不同numpy.nan变量引用指向的是同一个内存地址,但是其具有自己的值属性,值是不一样的,所以不能用==来判断,这点需要注意。

pandas 空字符串与na区别_pandas中对nan空值的判断相关推荐

  1. pandas 空字符串与na区别_关于python:Pandas用空白/空字符串替换NaN

    我有一个Pandas Dataframe,如下所示: 1    2       3 0  a  NaN    read 1  b    l  unread 2  c  NaN    read 我想用空 ...

  2. pandas 空字符串与na区别_python从安装到数据分析应用高手 Pandas处理文本数据(一)...

    数据分析师的一天 作为一名数据分析师,目前而言是以业务为中心,取数,清洗整理数据,取数与清洗数据会消耗大量的工作时间,毕竟代码需要跟着业务节奏变化. 其中文本数据相比数值数据更具复杂性,本文就pand ...

  3. Java进阶(二十一)java 空字符串与null区别

    java 空字符串与null区别 1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串, ...

  4. 空字符 空格字符(字符) 空字符串 NULL的区别

    [1]      空字符  空格字符(字符)[2]空字符串   [3] NULL的区别 1.1 字符 (1)首先必须明确字符型(char)是整数类型,其在内存单元是以整数形式存放. (2)其次,cha ...

  5. java 空串占用内存吗_java空字符串“”和null区别

    空字符串"" 1.类型:""是一个空字符串(String),长度为0,占内存,在内存中分配一个空间,可以使用Object中的方法(.toString()等) 2 ...

  6. Java 空格“ ”、空字符串“”和null区别

    空格" " 空字符串"" 1.类型:""是一个空字符串(String),长度为0,占内存,在内存中分配一个空间,可以使用Object对象中的 ...

  7. mysql设置字段为空字符串_NULL默认为mysql中的空字符串?

    我有一个奇怪的情况,一个字段不允许NULL值.如果我插入一行,该字段默认为空字符串,即使mysql声称默认值为NULL. mysql> describe user; +------------- ...

  8. python空类型用什么表示_python中怎么表示空值

    首先了解python对象的概念 python中,万物皆对象,所有的操作都是针对对象的. 那什么是对象?5是一个int对象,'oblong'是一个str对象,异常也是一个对象,抽象一点是,人,猫,够也是 ...

  9. python中的pandas的两种基本使用_pandas中join()的两种应用方法

    pandas中join()方法很神奇,join()方法虽然是连接方法,但是因为pandas有两个数据结构,join()方法针对两个数据结构有着不同的连接方法:1.根据指定的分隔符将Series中的各个 ...

最新文章

  1. Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性
  2. Flash,一次Bug的思考
  3. PM到底做什么(What Do Product Managers Do?)
  4. App Hub上传应用的状态说明
  5. Android总结 之 View系统学习(一)
  6. 再读王永庆卖米的故事
  7. js 跨域访问 找了好长时间
  8. Linux Fedora 15 安装 Atheros AR9285 无线网卡驱动
  9. 3行代码 为你的网站博客添加萌萌哒可爱二次元女动漫玩偶人物(看板娘)
  10. 基于SSM实现水果蔬菜商城管理系统
  11. 51cto学院mysql_Mysql -1_ Python系列视频(一)——Python语言基础_Python视频-51CTO学院...
  12. 迅时MX100G-S数字中继网关荣获《电信设备进网许可证》
  13. 多表关联查询(Oracle)
  14. 《A NEURAL TEXT-TO-SPEECH MODEL UTILIZING BROADCAST DATA MIXED WITH BACKGROUND MUSIC》阅读笔记
  15. 【Ybt OJ】[数学基础 第2章] 质数与约数
  16. SpringCloud之分布式配置中心组件Config从远程Git仓库读取配置文件
  17. 鸿蒙智能家居市场,荣耀智慧屏杀入彩电市场 重在智能家居 不把红海做成血海...
  18. 如何通俗的理解概率密度函数?
  19. (转载)怎样输入德语中的特殊字符
  20. 工程院院士:微软黑屏敲响我国信息安全警钟

热门文章

  1. 高考进行时,AI 监考老师已就位!
  2. 别人在加薪,你却在加班?快到这里和聪明的小伙伴一起充电吧!
  3. 和无用代码说再见!阿里文娱无损代码覆盖率统计方案
  4. 新的边缘架构兴起,Serverless 的发展方向在哪?
  5. 开发者请注意!2020年的大前端发展趋势已出炉! | 原力计划
  6. 如何在 Web 开发中找到第一份工作?
  7. 华为否认鸿蒙为噱头;谷歌公布 6 大 iOS 漏洞;GitLab 又发安全补丁 | 极客头条...
  8. Java 最常见的 200+ 面试题全解析
  9. 为什么都敏捷开发了项目还会延期?!| 技术头条
  10. Windows Notepad 迎来重大更新!