[python] nan类型

转载自:http://www.cnblogs.com/itdyb/p/5806688.html

python [吐槽]关于nan类型时遇到的问题

  今天在用写一段求和的代码时候,发现最后返回的是nan的结果,这段循环求和代码依次调用了三个函数,于是依次打印这三个函数的返回值,发现其中一个函数的返回值为nan,原来是因为这段函数里面没有相似的用户,所有返回结果为nan,于是我就想加一个判断条件,当结果为空时,跳过本次循环:

if res==nan:
    continue

本以为加上这一句话就可以了,于是重新运行了一下,oh,shit!!!!结果没有任何变化,以前是nan的还是一样没有跳过。于是我想到了我用到了Python的numpy库,会不会是numpy下的nan类型呢,于是修改一下判断条件:

if res==np.nan:
    continue

重新运行!还是不对。

找到原函数的位置,打印一下产生nan类型:

>>print(type(res))
<class 'numpy.float64'>

发现属于numpy.float64类型,没办法,我想要不把原来函数的返回值改为float型吧,于是找到原函数,修改:

return float(res)

然后在循环求和的代码段中加上:

if res==nan:
    continue

运行!gg 还是不行!

没办法。为了找到真凶,我只能拿出res挨着测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>res = np.nan
False
 
>>res = nan
False
 
>>res = 'NaN'
False
 
>>res = float ( 'NaN' )
False
 
>>> isNaN(res)
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
NameError: name  'isNaN'  is  not  defined

 天哪!这个nan到底是什么类型!

最后突然想到了py自带的math库下面好像有一个判断nan的函数——isnan,抱着必死的心态,试了试:

>>from math import isnan

>>isnan(res)
True

Wooooooo!True! 终于找到办法了!天哪!终于解决了,这一个小问题纠结了我一中午。。。

### PythonNaN 值的数据类型转换 在处理数据时,遇到 `NaN`(Not a Number)值是很常见的事情。这些值通常表示缺失或未定义的数据,在不同场景下可能需要不同的处理方式。 #### 方法一:使用 try-except 结构处理单个元素 当面对混合类型的列表并希望安全地将其中的 `NaN` 或者无法直接转换成整数的元素替换成特定值(比如 `None`),可以采用如下方法: ```python ordered_values = ['1', '2', 'nan', '4', float('nan'), 'hello', 5, None] def safe_float_conversion(value): try: converted_value = float(value) if math.isnan(converted_value): # 判断是否为 NaN return None else: return int(converted_value) # 尝试转为整型 except (ValueError, TypeError): return value cleaned_data = [safe_float_conversion(x) for x in ordered_values] print(cleaned_data) ``` 此代码片段通过自定义函数实现了对每个元素的安全转换逻辑[^2]。 #### 方法二:利用 Pandas 库中的 isna 函数批量操作 Pandas 提供了一个非常方便的方法——`pd.isna()` 来识别多种类型的缺失值,包括但不限于标准库中的 `float('nan')` 和 Pandas 特有的 `pd.NA` 类型。这使得我们可以轻松地遍历整个序列并将所有的缺失值统一替换为目标值。 ```python import pandas as pd ordered_values = ['1', '2', 'nan', '4', float('nan'), 'hello', 5, None, pd.NA] ordered_values_new = [None if pd.isna(item) else item for item in ordered_values] for item in ordered_values_new: print(f'Item: {item}, Type: {type(item)}') ``` 这种方法不仅简洁而且高效,特别适合于大规模数据分析任务中处理含有大量潜在缺失值的情况。 #### 方法三:NumPy 数组内的 dtype 更改 对于 NumPy 用户来说,有时会涉及到数组内部存储模式的变化需求。虽然默认情况下可以直接指定目标 dtypes 如 `int`, `float` 等让 NumPy 自动完成映射工作;但在某些特殊情形下,特别是涉及到了解码器配置等问题时,则需更加谨慎对待可能出现的异常情况。 ```python import numpy as np arr_with_nan = np.array([1., 2., np.nan], dtype=np.float64) # 直接更改 dtype 可能引发警告甚至错误 try: arr_int = arr_with_nan.astype(int) except Exception as e: print(e) # 推荐先过滤掉 nan 后再做类型转换 mask = ~np.isnan(arr_with_nan) filtered_arr = arr_with_nan[mask].astype(int) print(filtered_arr) ``` 这里展示了两种针对 NumPy 数组内含 `NaN` 的解决方案:一是简单粗暴地尝试强制转换可能会失败;二是推荐的做法是在执行任何进一步的操作之前先行去除那些不确定性的因素[^3]。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值