CSV导入MySQL时NaN值转换为NULL值报错解决方法
问题根因
报错unknown column 'nan' in field list来自两个核心问题:
- pandas读取CSV时,空单元格会被默认解析为浮点类型的
NaN值,Python的MySQL驱动拼接参数时,会将NaN转为字符串nan传入SQL语句,MySQL会将未加引号的nan识别为列名,找不到对应列就抛出该错误。 - 提供的CSV表头中
Zone3_Voltage和Zone3_Current之间缺失逗号分隔符,pandas读取时会将两个字段合并为单列,最终传入插入语句的参数个数和占位符不匹配,也会触发异常。
解决步骤
- 先修复CSV格式错误:打开CSV文件找到表头的
Zone3_Voltage Zone3_Current位置,在两个字段名之间补逗号,保证表头总列数和建表语句的40个字段完全对齐。 - 读取CSV后统一处理空值:将DataFrame中所有
NaN替换为Python原生None,MySQL驱动识别到None时会自动转为SQL标准NULL值插入,不会再生成nan字符串。处理代码如下:
import pandas as pd # 读取CSV时加skipinitialspace=True自动去除字段前后多余空格 df4 = pd.read_csv("你的CSV文件路径.csv", skipinitialspace=True) # 核心空值替换逻辑 df4 = df4.where(pd.notnull(df4), None)
- 优先使用pandas自带的
to_sql方法批量写入,避免手写逐行插入的参数拼接错误,代码示例:
from sqlalchemy import create_engine # 替换为自己的MySQL连接信息:用户名:密码@数据库地址:端口/库名 engine = create_engine("mysql+pymysql://账号:密码@127.0.0.1:3306/skynet_msa?charset=utf8mb4") # 批量追加写入数据 df4.to_sql( name="chamber_data", con=engine, if_exists="append", index=False, chunksize=1000 )
- 如果要保留原有逐行插入的逻辑,只需在循环前完成上述空值替换即可,优化后的代码如下:
# 先执行空值替换 df4 = df4.where(pd.notnull(df4), None) for i,row in df4.iterrows(): sql = "INSERT INTO skynet_msa.chamber_data (Testtag, Date, Temperature, Humidity, Zone1_Voltage, Zone1_Current, Zone1B_Voltage, Zone1B_Current, Zone1C_Voltage, Zone1C_Current, Zone2_Voltage, Zone2_Current, Zone2B_Voltage, Zone2B_Current, Zone2C_Voltage, Zone2C_Current, Zone3_Voltage, Zone3_Current, Zone3B_Voltage, Zone3B_Current, Zone3C_Voltage, Zone3C_Current, Zone4_Voltage, Zone4_Current, Zone4B_Voltage, Zone4B_Current, Zone4C_Voltage, Zone4C_Current, Zone5_Voltage, Zone5_Current, Zone5B_Voltage, Zone5B_Current, Zone5C_Voltage, Zone5C_Current, Zone6_Voltage, Zone6_Current, Zone6B_Voltage, Zone6B_Current, Zone6C_Voltage, Zone6C_Current) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" cursor.execute(sql, tuple(row)) print("Record inserted") # 所有数据插入完成后统一提交即可,无需逐行提交,能大幅提升写入效率 conn.commit()
注意事项
- 建表语句中
Date字段为datetime类型,但CSV中存储的时间值为54:01.1格式,缺失年月日信息,直接插入会触发datetime格式校验错误,需要先在pandas中补全为合法的datetime格式,或者将对应字段类型修改为varchar后再导入。 - 导出MS SQL数据到CSV时,可以直接在导出工具中设置NULL值的替换规则,将NULL导出为空值而非字符串
NaN,从源头减少后续处理成本。
内容的提问来源于stack exchange,提问作者Gracella Q Sumarlin
相关产品推荐
相关产品推荐

