如何從數據庫中讀取數據到DataFrame中?pandas提供這這樣的接口完成此工作——read_sql()。下面我們用離子來說明這個方法。
-
我們要從sqlite數據庫中讀取數據,引入相關模塊
-
-
read_sql接受兩個參數,一個是sql語句,這個你可能需要單獨學習;一個是con(數據庫連接)、read_sql直接返回一個DataFrame對象
-
打印一下,可以看到已經成功的讀取了數據
-
-
我們還可以使用index_col參數來規定將那一列數據設置為index
-
-
結果輸出為:
-
-
當然,我們可以設置多個index,只要將index_col的值設置為列表
-
-
輸出結果為:
-
-
寫入數據庫也很簡單,下面第二句用於刪除數據庫中已有的表"weather_2012",然后將df保存到數據庫中的"weather_2012"表
-
假如我們使用的是mysql數據庫也沒問題,我們只需要建立與mysql的連接即可,用下面的con代替上面的con可以達到的效果相同。
補充:
(1)DateFrane 可以將結果轉換成DataFrame

import pandas as pd import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db1') cursor = conn.cursor() # cursor.execute("DROP TABLE IF EXISTS test")#必須用cursor才行 sql = "select * from user" df = pd.read_sql(sql,conn,) aa=pd.DataFrame(df) print aa
(2)存儲
pd.io.sql.write_frame(df, "user_copy", conn)#不能用已經移除
pd.io.sql.to_sql(piece, "user_copy", conn,flavor='mysql',if_exists='replace')#必須制定flavor='mysql'

#!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db1') cursor = conn.cursor() # cursor.execute("DROP TABLE IF EXISTS user_copy")#必須用cursor才行 sql = "select * from user" df = pd.read_sql(sql,conn,chunksize=2) for piece in df: aa=pd.DataFrame(piece) # pd.io.sql.write_frame(df, "user_copy", conn)#不能用已經移除 pd.io.sql.to_sql(piece, "user_copy", conn,flavor='mysql',if_exists='replace')#必須制定flavor='mysql'
(3)根據條件添加一列數據
piece['xb'] = list(map(lambda x: '男' if x == '123' else '女', piece['pwd']))
(4)如果有漢字,鏈接時必須知道字符類型 charset="utf8"
(5)最后實現代碼(迭代讀取數據,根據一列內容新增一列,)

#!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db1',charset="utf8") cursor = conn.cursor() # cursor.execute("DROP TABLE IF EXISTS user_copy")#必須用cursor才行 sql = "select * from user" df = pd.read_sql(sql,conn,chunksize=2) for piece in df: # pd.io.sql.write_frame(df, "user_copy", conn)#不能用已經移除 piece['xb'] = list(map(lambda x: '男' if x == '123' else '女', piece['pwd'])) print(piece) pd.io.sql.to_sql(piece, "user_copy", conn,flavor='mysql',if_exists='append')#必須制定flavor='mysql'
(7)sqlalchemy鏈接 需要制定一些中文 create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/jd?charset=utf8", max_overflow=5)

# 用sqlalchemy鏈接 from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/db1?charset=utf8") sql = "select * from user" df = pd.read_sql(sql,engine,chunksize=2) for piece in df: print(piece) pd.io.sql.to_sql(piece, "user_copy", engine, flavor='mysql', if_exists='append')