让数据分析更高效!用 pandas 直接读写 sqlite3 数据,告别手动拼接 sql 语句!
1 环境准备
确保已安装pandas
和sqlite3
(前者需单独安装,后者是 python 内置):
pip install pandas
2 从 sqlite3 读取数据到 dataframe
基础用法:读取整个表
import pandas as pd import sqlite3 # 连接到数据库 conn = sqlite3.connect('test.db') # 读取 users 表到 dataframe df = pd.read_sql('select * from users', conn) print(df.head()) # 查看前5行数据 # 关闭连接 conn.close()
高级用法:筛选和聚合
query = ''' select name, avg(age) as avg_age -- 计算平均年龄 from users where age > 20 group by name ''' df = pd.read_sql(query, conn) print(df)
3 将 dataframe 写入 sqlite3
基本写入(全量覆盖)
# 创建一个示例 dataframe data = { 'name': ['david', 'eve'], 'age': [28, 32], 'email': ['david@test.com', 'eve@test.com'] } df = pd.dataframe(data) # 写入到 users 表(全量覆盖) df.to_sql( name='users', # 表名 con=conn, # 数据库连接 if_exists='replace', # 如果表存在,直接替换(慎用!) index=false # 不保存 dataframe 的索引列 ) conn.commit()
追加数据(增量写入)
df.to_sql( name='users', con=conn, if_exists='append', # 追加到现有表 index=false ) conn.commit()
4 实战场景:数据清洗 + 入库
假设有一个 csv 文件dirty_data.csv
,需要清洗后存入 sqlite3:
id,name,age,email 1, alice,30,alice@example.com 2, bob , invalid, bob@example.com # 错误年龄 3, charlie,35,missing_email
步骤 1:用 pandas 清洗数据
# 读取 csv df = pd.read_csv('dirty_data.csv') # 清洗操作 df['age'] = pd.to_numeric(df['age'], errors='coerce') # 无效年龄转为 nan df = df.dropna(subset=['age']) # 删除年龄无效的行 df['email'] = df['email'].fillna('unknown') # 填充缺失邮箱 df['name'] = df['name'].str.strip() # 去除名字前后空格 print(df)
步骤 2:写入数据库
with sqlite3.connect('test.db') as conn: # 写入新表 cleaned_users df.to_sql('cleaned_users', conn, index=false, if_exists='replace') # 验证写入结果 df_check = pd.read_sql('select * from cleaned_users', conn) print(df_check)
5 性能优化:分块写入大数据
处理超大型数据时(如 10 万行),避免一次性加载到内存:
# 分块读取 csv(每次读 1 万行) chunk_iter = pd.read_csv('big_data.csv', chunksize=1000) with sqlite3.connect('big_db.db') as conn: for chunk in chunk_iter: # 对每个块做简单处理 chunk['timestamp'] = pd.to_datetime(chunk['timestamp']) # 分块写入数据库 chunk.to_sql( name='big_table', con=conn, if_exists='append', # 追加模式 index=false ) print("全部写入完成!")
6 高级技巧:直接执行 sql 操作
pandas 虽然强大,但复杂查询仍需直接操作 sql:
# 创建临时 dataframe df = pd.dataframe({'product': ['a', 'b', 'c'], 'price': [10, 200, 150]}) # 写入 products 表 df.to_sql('products', conn, index=false, if_exists='replace') # 执行复杂查询(连接 users 和 orders 表) query = ''' select u.name, p.product, p.price from users u join orders o on u.id = o.user_id join products p on o.product_id = p.id where p.price > 10 ''' result_df = pd.read_sql(query, conn) print(result_df)
7 避坑指南
数据类型匹配问题:
- sqlite 默认所有列为
text
,但 pandas 会自动推断类型。 - 写入时可用
dtype
参数手动指定类型:df.to_sql('table', conn, dtype={'age': 'integer', 'price': 'real'})
主键和索引:
- pandas 不会自动创建主键或索引,需提前用 sql 语句定义表结构。
性能瓶颈:
- 写入大量数据时,关闭事务自动提交可提速:
with conn: df.to_sql(...) # 使用上下文管理器自动提交
- 写入大量数据时,关闭事务自动提交可提速:
8 总结
通过 pandas + sqlite3 的组合,你可以:
✅快速导入/导出数据:告别手动拼接 sql 语句。
✅无缝衔接数据分析:清洗、计算、可视化后直接入库。
✅处理海量数据:分块读写避免内存爆炸。
下一步建议:
- 尝试将 excel/csv 文件自动同步到 sqlite3 数据库。
- 学习使用
sqlalchemy
库增强 sql 操作能力。
到此这篇关于pandas使用sqlite3实战的文章就介绍到这了,更多相关pandas使用sqlite3内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
海报
150