Python处理空值NaN

py 复制代码
fork_address_temp=read_excel_column_to_list('./eqp_info.xls','Sheet1','车辆地址')

for i in fork_address_temp:

    print(type(i))

fork_address=[0 if address =='nan' else address for address in fork_address_temp]

fork_address
结果
复制代码
<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'str'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

<class 'float'>

Out[37]:

[nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

'10.7.132.27',

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan,

nan]

没有达到我需要的效果,把NaN值处理为0

尝试从 Excel 文件中读取地址,并将所有的 'nan' 替换为 0。然而,根据代码,似乎替换并没有按预期进行。以下是逐步解释正在发生的情况:

  1. 您使用 read_excel_column_to_list('./eqp_info.xls','Sheet1','车辆地址') 从 Excel 文件中读取了 '车辆地址' 列。

  2. 然后,您遍历了 fork_address_temp 中的每个项,并打印了每个项的类型。输出显示大多数项的类型是 'float',只有一个项的类型是 'str'(可能是具有值 '10.7.132.27' 的地址)。

  3. 您尝试使用列表推导式创建了一个名为 fork_address 的新列表。对于 fork_address_temp 中的每个 address,您试图使用表达式 0 if address == 'nan' else address 将 'nan' 替换为 0。

问题在于,您将 address 与字符串 'nan' 进行了比较。然而,当 Excel 读取空单元格时,通常会将它们表示为实际的 NaN(非数字)值,而不是字符串 'nan'。这就是为什么您的比较不起作用,替换没有按预期进行的原因。

为了解决这个问题,您应该将以下这行代码:

python 复制代码
fork_address=[0 if address =='nan' else address for address in fork_address_temp]

替换为:

python 复制代码
fork_address = [0 if isinstance(address, float) and math.isnan(address) else address for address in fork_address_temp]

请确保在代码开头导入 math 模块:

python 复制代码
import math

通过这种方式,您将检查地址是否为 NaN 浮点值,并将其替换为 0。以下是更新后的代码片段:

python 复制代码
import math

fork_address_temp = read_excel_column_to_list('./eqp_info.xls', 'Sheet1', '车辆地址')

fork_address = [0 if isinstance(address, float) and math.isnan(address) else address for address in fork_address_temp]

fork_address

这应该会得到您所期望的结果,其中 fork_address 列表中的 NaN 值将被替换为 0。

math需要单独安装吗?

不需要单独安装 math 模块,因为它是 Python 的内置模块,已经包含在标准库中。你可以直接在代码中导入并使用它,无需额外安装任何东西。

在使用 math 模块中的函数之前,只需要在代码中导入它即可:

python 复制代码
import math

# 然后就可以使用 math 模块中的函数了

这样,你就可以在你的代码中使用 math.isnan() 等函数来处理数学计算中的 NaN 值。

处理结果

py 复制代码
[0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

'10.7.132.27',

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0]

如何实现fork_num_temp与fork_address一一对应

要确保 fork_num_temp 和 fork_address 一一对应,您可以使用内置的 zip 函数来将这两个列表合并为一个元组的列表,其中每个元组包含 fork_num_temp 和对应的 fork_address。这样,您就可以一次迭代处理这两个列表,确保它们保持一一对应的关系。以下是如何实现的示例代码:

python 复制代码
fork_num_temp = read_excel_column_to_list('./eqp_info.xls', 'Sheet1', '车辆编号')
fork_address_temp = read_excel_column_to_list('./eqp_info.xls', 'Sheet1', '车辆地址')

import math

fork_address = [0 if isinstance(address, float) and math.isnan(address) else address for address in fork_address_temp]

# 确保 fork_num_temp 和 fork_address 一一对应
fork_data = list(zip(fork_num_temp, fork_address))

# 打印合并后的列表
for fork_num, address in fork_data:
    print(f"Fork Num: {fork_num}, Address: {address}")

在这个示例中,fork_data 是一个列表,其中每个元素是一个包含 fork_num_temp 和 fork_address 的元组。通过在这个列表上迭代,您可以同时访问对应的车辆编号和地址。

请注意,这个示例假设 fork_num_temp 和 fork_address_temp 具有相同的长度,以便可以一一对应。如果长度不同,这种方法可能会导致信息丢失。

设计一个函数,我根据fork_num查询fork_data,返回对应的addres

当您需要根据 fork_num 查询 fork_data 并返回对应的地址时,可以编写一个函数来实现这个功能。下面是一个示例函数:

python 复制代码
def find_address_by_fork_num(fork_data, target_fork_num):
    for fork_num, address in fork_data:
        if fork_num == target_fork_num:
            return address
    return None  # 如果找不到对应的地址,返回 None 或其他适当的值

# 示例数据
fork_num_temp = ['F1', 'F2', 'F3']
fork_address_temp = ['Address1', 'Address2', 'Address3']
fork_address = [0 if isinstance(address, float) and math.isnan(address) else address for address in fork_address_temp]
fork_data = list(zip(fork_num_temp, fork_address))

# 调用函数来查询地址
target_fork_num = 'F2'
found_address = find_address_by_fork_num(fork_data, target_fork_num)

if found_address is not None:
    print(f"The address for fork number {target_fork_num} is {found_address}")
else:
    print(f"No address found for fork number {target_fork_num}")

在这个示例中,find_address_by_fork_num 函数接受一个 fork_data 列表和一个目标 fork_num 作为参数。它会遍历 fork_data,找到匹配的 fork_num 并返回对应的地址。如果找不到匹配的 fork_num,函数会返回 None 或其他适当的值。

请根据您的实际数据和需求调整代码中的示例数据和函数调用部分。

相关推荐
朝朝辞暮i1 分钟前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
专注仿真11 分钟前
决策树的算法
开发语言·高性能算法
Evand J13 分钟前
【电机滤波例程2】负载转矩增广扩展卡尔曼滤波(EKF)原理与MATLAB例程:五维PMSM状态与负载阶跃估计。订阅专栏后可查看完整代码
开发语言·matlab·电机·ekf·卡尔曼滤波
迅猛龙办公室16 分钟前
python实现简单进度条
java·前端·python
郝学胜_神的一滴19 分钟前
AI 编程智能体 06:用Anaconda搞定Python多环境,彻底告别版本兼容灾难
人工智能·python
清水白石00820 分钟前
Python 对象模型深度解析:从“一切皆对象”到 id、type、isinstance 底层机制与小整数缓存原理
开发语言·python·缓存
for_ever_love__24 分钟前
Python 进阶——迭代器、生成器、装饰器与 asyncio
python·装饰器·生成器·大模型开发
燕落南枝25 分钟前
c语言 洛谷P1765手机题解
c语言·开发语言
Rosanci27 分钟前
Codex 下载与本地部署实战:从安装到运行全流程指南
开发语言·前端·算法·chatgpt·codex
5G微创业28 分钟前
去水印API如何实现技术变现
python·sdk·短视频