Pandas使用SQLite3實(shí)戰(zhàn)
讓數(shù)據(jù)分析更高效!用 Pandas 直接讀寫(xiě) SQLite3 數(shù)據(jù),告別手動(dòng)拼接 SQL 語(yǔ)句!
1 環(huán)境準(zhǔn)備
確保已安裝 pandas
和 sqlite3
(前者需單獨(dú)安裝,后者是 Python 內(nèi)置):
pip install pandas
2 從 SQLite3 讀取數(shù)據(jù)到 DataFrame
基礎(chǔ)用法:讀取整個(gè)表
import pandas as pd import sqlite3 # 連接到數(shù)據(jù)庫(kù) conn = sqlite3.connect('test.db') # 讀取 users 表到 DataFrame df = pd.read_sql('SELECT * FROM users', conn) print(df.head()) # 查看前5行數(shù)據(jù) # 關(guān)閉連接 conn.close()
高級(jí)用法:篩選和聚合
query = ''' SELECT name, AVG(age) as avg_age -- 計(jì)算平均年齡 FROM users WHERE age > 20 GROUP BY name ''' df = pd.read_sql(query, conn) print(df)
3 將 DataFrame 寫(xiě)入 SQLite3
基本寫(xiě)入(全量覆蓋)
# 創(chuàng)建一個(gè)示例 DataFrame data = { 'name': ['David', 'Eve'], 'age': [28, 32], 'email': ['david@test.com', 'eve@test.com'] } df = pd.DataFrame(data) # 寫(xiě)入到 users 表(全量覆蓋) df.to_sql( name='users', # 表名 con=conn, # 數(shù)據(jù)庫(kù)連接 if_exists='replace', # 如果表存在,直接替換(慎用?。? index=False # 不保存 DataFrame 的索引列 ) conn.commit()
追加數(shù)據(jù)(增量寫(xiě)入)
df.to_sql( name='users', con=conn, if_exists='append', # 追加到現(xiàn)有表 index=False ) conn.commit()
4 實(shí)戰(zhàn)場(chǎng)景:數(shù)據(jù)清洗 + 入庫(kù)
假設(shè)有一個(gè) CSV 文件 dirty_data.csv
,需要清洗后存入 SQLite3:
id,name,age,email 1, Alice,30,alice@example.com 2, Bob , invalid, bob@example.com # 錯(cuò)誤年齡 3, Charlie,35,missing_email
步驟 1:用 Pandas 清洗數(shù)據(jù)
# 讀取 CSV df = pd.read_csv('dirty_data.csv') # 清洗操作 df['age'] = pd.to_numeric(df['age'], errors='coerce') # 無(wú)效年齡轉(zhuǎn)為 NaN df = df.dropna(subset=['age']) # 刪除年齡無(wú)效的行 df['email'] = df['email'].fillna('unknown') # 填充缺失郵箱 df['name'] = df['name'].str.strip() # 去除名字前后空格 print(df)
步驟 2:寫(xiě)入數(shù)據(jù)庫(kù)
with sqlite3.connect('test.db') as conn: # 寫(xiě)入新表 cleaned_users df.to_sql('cleaned_users', conn, index=False, if_exists='replace') # 驗(yàn)證寫(xiě)入結(jié)果 df_check = pd.read_sql('SELECT * FROM cleaned_users', conn) print(df_check)
5 性能優(yōu)化:分塊寫(xiě)入大數(shù)據(jù)
處理超大型數(shù)據(jù)時(shí)(如 10 萬(wàn)行),避免一次性加載到內(nèi)存:
# 分塊讀取 CSV(每次讀 1 萬(wàn)行) chunk_iter = pd.read_csv('big_data.csv', chunksize=1000) with sqlite3.connect('big_db.db') as conn: for chunk in chunk_iter: # 對(duì)每個(gè)塊做簡(jiǎn)單處理 chunk['timestamp'] = pd.to_datetime(chunk['timestamp']) # 分塊寫(xiě)入數(shù)據(jù)庫(kù) chunk.to_sql( name='big_table', con=conn, if_exists='append', # 追加模式 index=False ) print("全部寫(xiě)入完成!")
6 高級(jí)技巧:直接執(zhí)行 SQL 操作
Pandas 雖然強(qiáng)大,但復(fù)雜查詢?nèi)孕柚苯硬僮?SQL:
# 創(chuàng)建臨時(shí) DataFrame df = pd.DataFrame({'product': ['A', 'B', 'C'], 'price': [10, 200, 150]}) # 寫(xiě)入 products 表 df.to_sql('products', conn, index=False, if_exists='replace') # 執(zhí)行復(fù)雜查詢(連接 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 避坑指南
數(shù)據(jù)類型匹配問(wèn)題:
- SQLite 默認(rèn)所有列為
TEXT
,但 Pandas 會(huì)自動(dòng)推斷類型。 - 寫(xiě)入時(shí)可用
dtype
參數(shù)手動(dòng)指定類型:df.to_sql('table', conn, dtype={'age': 'INTEGER', 'price': 'REAL'})
主鍵和索引:
- Pandas 不會(huì)自動(dòng)創(chuàng)建主鍵或索引,需提前用 SQL 語(yǔ)句定義表結(jié)構(gòu)。
性能瓶頸:
- 寫(xiě)入大量數(shù)據(jù)時(shí),關(guān)閉事務(wù)自動(dòng)提交可提速:
with conn: df.to_sql(...) # 使用上下文管理器自動(dòng)提交
- 寫(xiě)入大量數(shù)據(jù)時(shí),關(guān)閉事務(wù)自動(dòng)提交可提速:
8 總結(jié)
通過(guò) Pandas + SQLite3 的組合,你可以:
? 快速導(dǎo)入/導(dǎo)出數(shù)據(jù):告別手動(dòng)拼接 SQL 語(yǔ)句。
? 無(wú)縫銜接數(shù)據(jù)分析:清洗、計(jì)算、可視化后直接入庫(kù)。
? 處理海量數(shù)據(jù):分塊讀寫(xiě)避免內(nèi)存爆炸。
下一步建議:
- 嘗試將 Excel/CSV 文件自動(dòng)同步到 SQLite3 數(shù)據(jù)庫(kù)。
- 學(xué)習(xí)使用
sqlalchemy
庫(kù)增強(qiáng) SQL 操作能力。
到此這篇關(guān)于Pandas使用SQLite3實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Pandas使用SQLite3內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫(kù)詳解
- 使用Python連接SQLite數(shù)據(jù)庫(kù)的操作步驟
- 通過(guò)python封裝SQLite3的示例代碼
- Python數(shù)據(jù)庫(kù)編程之SQLite和MySQL的實(shí)踐指南
- Python的sqlite3模塊中常用函數(shù)
- Python中SQLite數(shù)據(jù)庫(kù)的使用
- Python數(shù)據(jù)庫(kù)sqlite3圖文實(shí)例詳解
- Python使用sqlite3第三方庫(kù)讀寫(xiě)SQLite數(shù)據(jù)庫(kù)的方法步驟
- Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)
- python處理SQLite數(shù)據(jù)庫(kù)的方法
- SQLite5-使用Python來(lái)讀寫(xiě)數(shù)據(jù)庫(kù)
相關(guān)文章
關(guān)于Python下載大文件時(shí)哪種方式速度更快
這篇文章主要介紹了關(guān)于Python下載大文件時(shí)哪種方式速度更快,通常,我們都會(huì)用 requests 庫(kù)去下載,這個(gè)庫(kù)用起來(lái)太方便了,需要的朋友可以參考下2023-04-04python pycharm最新版本激活碼(永久有效)附python安裝教程
PyCharm是一個(gè)多功能的集成開(kāi)發(fā)環(huán)境,只需要在pycharm中創(chuàng)建python file就運(yùn)行python,并且pycharm內(nèi)置完備的功能,這篇文章給大家介紹python pycharm激活碼最新版,需要的朋友跟隨小編一起看看吧2020-01-01Python實(shí)現(xiàn)批量提取Word中的表格
表格在word文檔中常見(jiàn)的文檔元素之一,操作word文件時(shí)有時(shí)需要提取文件中多個(gè)表格的內(nèi)容到一個(gè)新的文件,本文給大家分享兩種批量提取文檔中表格的兩種方法,希望對(duì)大家有所幫助2024-02-02Python字符串中如何去除數(shù)字之間的逗號(hào)
這篇文章主要介紹了Python字符串中如何去除數(shù)字之間的逗號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05