使用split处理pandas列时遇到NaN浮点数报错如何处理或忽略
问题根源
- pandas读取csv时,你指定的
na_values对应内容会被转换为np.NaN,属于float浮点类型,没有字符串的split方法,直接调用会触发类型错误 - 现有代码的空值判断逻辑完全错误:
str(y=="nan")是先执行y == "nan"得到布尔值,再把布尔值转为字符串,非空字符串在if判断中始终为真,会误跳过所有行
修复方案
方案1:修改循环内的空值判断逻辑
用pandas内置的pd.isna()方法判断空值,兼容np.NaN、None等多种空类型,修改后代码如下:
import pandas as pd import csv missing_values = ["#N/A","None","nan"] df_eval = pd.read_csv('e.csv',na_values = missing_values) with open('e1.csv', 'a', newline='',errors='ignore', encoding="utf8" ) as f: writer = csv.writer(f) for j in range(len(df_eval)): x=df_eval.iloc[j,1] y=df_eval.iloc[j,2] # 正确判断空值,空行直接跳过 if pd.isna(y): continue # 此处再调用split不会报错 y_split_res = y.split(",") print("y", y)
方案2:提前过滤空值行(效率更高,适合数据量较大的场景)
提前将y列为空的行从数据框中删除,后续循环无需再做空值判断:
import pandas as pd import csv missing_values = ["#N/A","None","nan"] df_eval = pd.read_csv('e.csv',na_values = missing_values) # 提前过滤y列(第三列,索引为2)非空的行,重置索引 df_eval = df_eval[df_eval.iloc[:,2].notna()].reset_index(drop=True) with open('e1.csv', 'a', newline='',errors='ignore', encoding="utf8" ) as f: writer = csv.writer(f) for j in range(len(df_eval)): x=df_eval.iloc[j,1] y=df_eval.iloc[j,2] # 无需再判断空值,直接调用split即可 y_split_res = y.split(",") print("y", y)
注意事项
不要用y == np.nan的方式判断空值,NaN和任何值做等值判断都会返回False,必须用pd.isna(y)或者np.isnan(y)做空值校验。
如果不需要跳过空值行,可以给空值填充默认空字符串再执行split:y = y if pd.notna(y) else ""。
内容的提问来源于stack exchange,提问作者d12
相关产品推荐
相关产品推荐

