如何将pandas DataFrame的numpy.int64转为Python原生int
解决方案
报错的核心原因是pyodbc无法识别numpy封装的数值类型,需要将列的dtype转换为object类型,列内元素为Python原生int。下面是3种适配你当前版本环境的可行方案:
方案1:逐元素转换(适合10万行以下小数据量)
直接通过apply调用Python原生int方法逐元素转换:
# 替换target_col为你需要转换的列名 df['target_col'] = df['target_col'].apply(int)
转换后列的dtype会变为object,内部元素均为原生int类型,可直接导入数据库。
方案2:列表转换(适合10万行以上大数据量)
利用numpy数组转Python列表时自动将numpy.int64转换为原生int的特性实现高效批量转换,效率比apply高30%以上:
df['target_col'] = pd.Series(df['target_col'].to_list(), dtype='object')
方案3:to_sql导入阶段直接适配(无需提前转换数据)
如果你使用pandas的to_sql方法导入数据库,可直接通过dtype参数指定SQL字段类型,框架会自动完成类型适配,无需提前处理DataFrame:
from sqlalchemy import create_engine, Integer # 初始化数据库连接引擎(替换为你自己的连接字符串) engine = create_engine('mssql+pyodbc://user:password@dsn_name') # 导入时指定目标列的类型为SQL整型 df.to_sql( name='你的表名', con=engine, if_exists='append', index=False, # 所有需要适配的整数列都可以在这里指定类型 dtype={ 'target_col': Integer() } )
注意事项
- 转换前需确认目标列无NaN空值,否则转int会抛出异常,空值可先通过
df['target_col'] = df['target_col'].fillna(0)填充默认值后再处理。 - 需要批量转换多列时可直接遍历处理:
# 替换为你需要转换的所有整数列名 int_cols = ['col1', 'col2', 'col3'] for col in int_cols: df[col] = df[col].apply(int)
内容的提问来源于stack exchange,提问作者chic9009
相关产品推荐
相关产品推荐

