Pandas写入SQLite时金额字段数据类型异常问题求助
解决CSV金额字段写入SQLite3的数值异常问题
问题核心是你没处理欧洲格式的数字(千分位用.、小数位用,),单纯删除空格后字段仍为字符串类型,强行写入REAL列会导致存储异常,SUM计算自然出错。按以下步骤修复:
处理流程
第一步:清理并转换金额字段
先移除字段前后的分号和多余空格,再替换千分位的.为空,把小数位的,换成.,最后转为数值类型:# 假设金额列名为'amount' df['amount'] = df['amount'].str.strip('; ') # 移除前后的分号和空格 df['amount'] = df['amount'].str.replace('.', '', regex=False) # 删除千分位分隔符 df['amount'] = df['amount'].str.replace(',', '.', regex=False) # 替换小数分隔符为标准格式 df['amount'] = pd.to_numeric(df['amount'], errors='coerce') # 转为数值类型,错误值设为NaN用
pd.to_numeric转换后,字段会变成float64类型,这是SQLite REAL类型对应的Python类型。第二步:验证转换结果
执行print(df['amount'].dtype)确认类型为float64,同时用df['amount'].isna().sum()统计转换失败的NaN值,排查CSV中的脏数据。第三步:写入SQLite时指定类型
写入数据库时,通过dtype参数明确指定列类型,确保SQLite正确识别:import sqlite3 conn = sqlite3.connect('your_database.db') # if_exists根据需求选'replace'/'append'/'fail' df.to_sql('your_table', conn, if_exists='replace', index=False, dtype={'amount': 'REAL'}) # 测试SUM查询 cursor = conn.cursor() cursor.execute('SELECT SUM(amount) FROM your_table') print(cursor.fetchone()[0]) conn.close()
关键说明
- 不能跳过类型转换:如果字段仍是字符串,即使SQLite列定义为REAL,存储的仍是字符串,SUM会按字符串逻辑计算,结果完全错误。
errors='coerce'可把无效值转为NaN,方便定位CSV中的非数字内容。
内容的提问来源于stack exchange,提问作者Enrico Meggiolaro
相关产品推荐
相关产品推荐

