You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSV导入MySQL时NaN值转换为NULL值报错解决方法

问题根因

报错unknown column 'nan' in field list来自两个核心问题:

  1. pandas读取CSV时,空单元格会被默认解析为浮点类型的NaN值,Python的MySQL驱动拼接参数时,会将NaN转为字符串nan传入SQL语句,MySQL会将未加引号的nan识别为列名,找不到对应列就抛出该错误。
  2. 提供的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:09:27