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

导入CSV至Postgres时pandas转换float为int出现NaN报错如何解决

问题根因

你遇到的ValueError: cannot convert float NaN to integer报错,是因为CSV文件中应该为整数的列存在空值,pandas读取CSV时会自动将包含空值的整数列识别为float类型(普通int类型不支持空值存储),你直接对所有float值做int转换时碰到空值NaN就会触发报错。

另外你原来用iterrows双层循环处理的方式效率极低,CSV行数多的话运行速度会非常慢,完全可以用pandas向量化操作替代,不需要逐行逐单元格处理。

修改后的处理代码

把你bulkDownload函数中读取CSV后的处理部分替换为如下代码即可,适配所有下载的CSV文件自动转换符合要求的列:

def bulkDownload(url, file_format):
    driver.get(url)
    downloadBtn = waitAndGetElement(600000, EC.presence_of_element_located((By.XPATH, '//a[text()=" Download Now"]')))
    time.sleep(5)
    downloadBtn.click()
    current_url = driver.current_url
    export_num = current_url.split("/")[-1]

    file_path = file_format.format(export_num)
    while not os.path.exists(file_path):
        time.sleep(2)
    
    print("Printing csv present at " + file_path) # 读取下载的文件输出到csvs文件夹
    df = pd.read_csv(file_path, index_col=None, header=0)
    df = df.loc[:,~df.columns.duplicated()]
    
    # 自动处理所有可转整数的float列
    for col in df.columns:
        # 仅处理float类型的列
        if df[col].dtype == 'float64':
            # 判断该列所有非空值是否本质为整数(小数部分均为0)
            if df[col].dropna().apply(lambda x: x.is_integer()).all():
                # 方案1:对应Postgres字段允许为空时使用,转为支持空值的Int64类型,整数不会带.0后缀
                df[col] = df[col].astype('Int64')
                # 方案2:对应Postgres字段不允许为空时使用,空值填充为0(可自定义默认值)后转普通int
                # df[col] = df[col].fillna(0).astype('int64')
    return df

调整说明

  • 两种转换方案二选一即可,不会改动原本就是小数的float列,仅转换本来应该为整数的列
  • 不需要手动指定要转换的列名,所有下载的CSV都会自动识别处理

内容的提问来源于stack exchange,提问作者KoldKonfusion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:36:04