目的
在數(shù)據(jù)分析時(shí)系瓢,我們有中間結(jié)果慷垮,或者最終的結(jié)果揖闸,需要保存到數(shù)據(jù)庫(kù)中;或者我們有一個(gè)中間的結(jié)果料身,如果放到數(shù)據(jù)庫(kù)中通過(guò)sql操作會(huì)更加的直觀汤纸,處理后再將結(jié)果讀取到DataFrame中。這兩個(gè)場(chǎng)景芹血,就需要用到DataFrame的to_sql操作贮泞。
具體的操作
- 連接數(shù)據(jù)庫(kù)代碼
import pandas as pd
from sqlalchemy import create_engine
# default
engine = create_engine('mysql+pymysql://ledao:ledao123@localhost/pandas_learn')
original_data = pd.read_sql_table('cellfee', engine)
original_data
結(jié)果如下所示。
- 對(duì)數(shù)據(jù)進(jìn)行匯總祟牲,每個(gè)小區(qū)的電費(fèi)進(jìn)行求和放到Series中隙畜,然后將所有小區(qū)的總電費(fèi)放到DataFrame中,最后將DataFrame保存到數(shù)據(jù)庫(kù)中说贝,代碼如下所示议惰。
all_cells = []
for k, v in original_data.groupby(by=['cityid', 'cellid']):
onecell = pd.Series(data=[k[0], k[1], v['fee'].sum()], index=['cityid', 'cellid', 'fee_sum'])
all_cells.append(onecell)
all_cells = pd.DataFrame(all_cells)
all_cells.to_sql(name='cells_fee', con=engine, chunksize=1000, if_exists='replace', index=None)
對(duì)于DataFrame的to_sql函數(shù),需要注意的參數(shù)在代碼中已經(jīng)寫(xiě)出來(lái)乡恕,其中比較重要的是chunksize言询、if_exists和index俯萎。
chunksize可以設(shè)置一次入庫(kù)的大小运杭;if_exists設(shè)置如果數(shù)據(jù)庫(kù)中存在同名表怎么辦夫啊,‘replace’表示將表原來(lái)數(shù)據(jù)刪除放入當(dāng)前數(shù)據(jù);‘a(chǎn)ppend’表示追加辆憔;‘fail’則表示將拋出異常撇眯,結(jié)束操作,默認(rèn)是‘fail’虱咧;index=接受boolean值熊榛,表示是否將DataFrame的index也作為表的列存儲(chǔ)。
最終存表的結(jié)果如下圖所示腕巡。