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

devtools/2024/9/24 4:27:36/

目录

(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生成空缺数值

python">import numpy as np
import pandas as pdx = 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值。

python">import pandas as pdx = 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类型对于很多算术操作来更简单,因此被优先考虑。

python">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的操作会报错:

python">None + 1

运行报错

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

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

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

4.判断是否为NaN或者None

用np.isnan()

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

python">import numpy as npret = np.isnan(np.nan)
print(ret)  # True# ret = np.isnan(None) 
# TypeError: ufunc 'isnan' not supported for the input types

用np.isnull()

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

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

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

(2)dataframe空值处理

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

将空值变为指定值

python">import pandas as pd
import numpy as npdata = 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  NaNdata.fillna(999, inplace = True)
print(data)

前向填充和后向填充

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

python">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.0data.fillna(method='bfill', inplace = True)
print(data)

使用fillna方法将NaN转换为零

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

python">import pandas as pddata = {'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   NaNA    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方法的示例代码:

python">import pandas as pd
import numpy as npdata = {'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   NaNA    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变为指定值

python">import pandas as pddf2 = 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()

python">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的时候才进行删除,同时还可以按指定的轴删除。

python">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

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

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

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

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

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

python">import pandas as pd
import numpy as npdata = 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  NaNresult = 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

python">import pandas as pdpd.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

python">df['column_name'][i] is not np.nan

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

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

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

python">import numpy as np
import pandas as pddf1 = pd.DataFrame(data=None)
print(df1.empty)  # Truedf2 = pd.DataFrame(data=[np.nan, np.nan])
print(df2)
'''0
0 NaN
1 NaN
'''
print(df2.empty)  # Falsedf3 = pd.DataFrame(data=[np.nan, 2])
print(df3.empty)  # False

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

一个简单例子

python">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类型

python">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)转换,会发生错误

python">ValueError: cannot convert float NaN to integer

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

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

end


http://www.ppmy.cn/devtools/40765.html

相关文章

【数据库】数据库事务原理

事务特性 https://blog.csdn.net/zxcyxg123/article/details/132020499 MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;即多版本并发控制&#xff0c;是一种并发控制的方法&#xff0c;主要用于数据库管理系统中&#xff0c;以实现对数据库…

如何使用 await-to-js 库优雅的处理 async await 错误

通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文章进行总结对整个学习的过程进行一个梳理同时分享给其他人。 JS 异步编程进化之路 回调地狱阶段 在正式介绍 await-to-js 这个库之前&#xff0c;让我们先简单的回顾一下有关于在 JavaScript 这门语言…

Java 集合-List

集合主要分为两组(单列集合, 双列集合) Connection 接口有两个重要的子接口LIst 和 Set, 它们的实现子类都是单列集合, Map 接口的实现子类是双列集合, 存放的是 K-V Connection 接口 Collection 接口和常用方法 下面以 ArrayList 演示一下 add: 添加单个元素remove: 删除指…

watch侦听器

在 Vue.js 中&#xff0c;watch 侦听器用于观察和响应 Vue 实例上的数据变动。当你想在数据变化时执行异步或开销较大的操作时&#xff0c;这个方式是最有用的。与计算属性不同&#xff0c;watch 侦听器允许你执行更复杂的逻辑&#xff0c;包括异步操作&#xff0c;并且只有当观…

工厂自动化升级改造参考(01)--设备通信协议详解及选型

以下是整合了通信协议的特点、应用场景、优缺点以及常用接口方式的描述: 以太网/IP: 来历: 以太网是一种局域网技术,由罗伯特梅特卡夫和大卫博格在1973年开发。IP是网络层协议,负责在网络中的设备间传输数据。特点:基于标准的以太网技术,使用TCP/IP协议栈,支持高速数据传…

bat xcopy 解析

echo off set source_folder"C:\path\to\source" set destination_folder"C:\path\to\destination" set exclude_file"C:\path\to\excluded_folders.txt"REM 创建目标文件夹&#xff08;如果不存在&#xff09; mkdir %destination_folder% 2>…

git:分支删除

删除本地分支&#xff1a; git branch -d branch_name其中&#xff0c;branch_name 是你要删除的本地分支的名称。如果分支上有未合并的更改&#xff0c;使用 -d 选项会提示你确认删除。 如果要强制删除未合并的分支&#xff0c;可以使用 -D 选项&#xff1a; git branch -D…

web server apache tomcat11-33-CDI

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…