使用numpy在列表推导式中检测np.nan值失败的问题
问题分析与解决
先说结论:不是列表推导式改变了值的类型,问题出在两个核心点:
np.isnan()仅支持检测数值类型的NaN,遇到字符串会直接报错。你的DataFrame列里混合了字符串('a'、'b')和浮点型的np.nan,遍历到字符串时调用np.isnan()会直接触发类型错误,根本轮不到检测那个NaN。- Pandas对混合类型列的缺失值处理,自带的方法比numpy的更适配,没必要硬用
np.isnan()。
正确的处理方式
方式1:用pd.isna()遍历检测
pd.isna()能兼容字符串、数值等多种类型的缺失值判断,不会报错:
import pandas as pd import numpy as np data = pd.DataFrame({'col':['a', 'b', np.nan]}) [print('NaN') if pd.isna(i) else print('Not NaN') for i in data.col]
方式2:直接对整列操作(更符合Pandas风格,效率更高)
比起列表推导式,直接用Pandas的列方法更简洁高效:
data['col'].apply(lambda x: print('NaN') if pd.isna(x) else print('Not NaN')) # 如果需要替换缺失值,还可以这么写 data['col'] = data['col'].fillna('NaN') print(data)
原代码失效的原因
原代码运行时,第一个元素是字符串'a',执行np.isnan('a')时,numpy会抛出TypeError: ufunc 'isnan' not supported for the input types——因为它无法处理字符串类型的输入,代码直接中断,根本没机会执行到检测np.nan的步骤。
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

