HOWTO · Python
在 Python 中从列表中移除 NaN
本教程演示了如何从 Python 列表中删除 NaN。
本页内容
NaN 是一种特殊的浮点数值,常用于表示未定义或无法表示的数值结果。它与普通字符串 'nan' 不同。对于数值列表,可使用 Python 的 math.isnan();对于数值数组,NumPy 的 numpy.isnan() 很方便。要移除字面字符串 'nan',可直接比较字符串值。若混合数据同时包含数值 NaN 和字符串 'nan',可将 pandas.isnull() 与字符串比较结合使用。
使用 math.isnan() 从 Python 列表中移除 NaN
Python 标准库中的 math.isnan() 函数可以识别数值 NaN。它是函数,不是方法。NaN 与自身比较时并不相等,因此像 x != x 这样的检查也能识别它;不过,math.isnan() 能更清楚地表达意图。仅当列表中包含 math.isnan() 可接受的数值时,才适合使用这种方法;它不能用于通用地检查任意字符串或对象。math.isnan() 的中文文档目标目前不可用,以下链接保留英文文档:math.isnan() 参考。
下面的完整示例会筛选数值列表,并保留原列表不变:
import math
values = [1, 2, float("nan"), 4]
without_nan = [value for value in values if not math.isnan(value)]
print(without_nan)
[1, 2, 4]
使用 numpy.isnan() 从 Python 列表中移除 NaN
如果项目中已经使用 NumPy,numpy.isnan() 可以对列表或数组中的数值逐一进行检查。如有需要,可使用 python -m pip install numpy 安装 NumPy。示例会先将输入转换为数组,再创建布尔掩码,选出不是 NaN 的值,最后将结果转换回 Python 列表。因此最终结果是列表,而不是 NumPy 数组。
import numpy as np
values = [1, 2, np.nan, 4]
array = np.array(values)
without_nan = array[~np.isnan(array)].tolist()
print(without_nan)
[1.0, 2.0, 4.0]
从 Python 列表中移除字符串 ’nan'
作为哨兵值的字符串只是普通文本,并不是浮点数 NaN。如果数据已经是字符串列表,可以直接比较每一项,移除完全匹配的小写字符串 'nan'。这样会保留其他项目原有的类型和拼写。如果数据中的大小写或空白形式不同,请相应调整比较条件。
values = ["1", "2", "nan", "8"]
without_string_nan = [value for value in values if value != "nan"]
print(without_string_nan)
['1', '2', '8']
如果先用 str() 转换每一项,保留下来的数字也会变成字符串。这在规范化数据时可能有用,但会改变结果中的类型;若列表中本来就有要移除的字符串,则无需这样转换。
使用 pandas.isnull() 从混合 Python 列表中移除 NaN 和字符串 ’nan'
对于混合列表,可使用 pandas.isnull() 识别数值 NaN 等缺失值,再将字面字符串 'nan' 作为单独条件进行比较。pandas.isnull() 不会把文本 'nan' 视为缺失值。下面的示例需要安装 pandas(python -m pip install pandas),并会保留其他字符串和数字的原有类型。pandas.isnull() 参考介绍了缺失值检查。
import pandas as pd
values = ["Ada", 23, "nan", "London", float("nan")]
without_missing_or_string_nan = [
value
for value in values
if not pd.isnull(value) and value != "nan"
]
print(without_missing_or_string_nan)
['Ada', 23, 'London']