导入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
相关产品推荐
相关产品推荐

