在目前大數(shù)據(jù)和人工智能的大趨勢下,越來越多的人開始學習python作為自己入手數(shù)據(jù)和AI的第一門語言,筆者也是如此。很多人在接觸python的第一步都是學習pandas,主要是這個框架是最接近于R和Matlab學習起來輕松易懂。但是在pandas的使用中,有很多問題和很多人因為對編程和計算機概念不理解,導致很多很多的坑,筆者在此開一個系列博文,不定期更新中會將自己遇到的坑介紹給大家。
pandas坑之to_sql
pandas是將格式化數(shù)據(jù)直接編程python可讀的DataFrame格式(其實本質(zhì)上就是字典,并且自動設置了index和colunms),pandas本身的操作給了用戶很好的體驗和數(shù)據(jù)分析過程,但是pandas從數(shù)據(jù)庫讀取再轉(zhuǎn)錄入數(shù)據(jù)庫是不少新人一直頭疼的問題,筆者也為此最初頭疼不已。根據(jù)《利用python進行數(shù)據(jù)分析》的書中,有大致介紹一個函數(shù)——to_sql,相信很多人都是對此了解的。
但是,使用to_sql這個函數(shù)有一個問題,雖然to_sql函數(shù)可以直接將字典數(shù)據(jù)直接存入數(shù)據(jù)庫,但是,to_sql限制是非常之大的(畢竟別人寫的類)
我們先看一個操作
import pandas as pd
import pymysql
conn=pymysql.connect(host,port,user,password,charset,db)
df1=pd.DataFrame(list)
df.to_sql(tablename,conn)
相信很多人都是按照以上進行的傻瓜操作,但是筆者在這里只能告訴你們,這是大錯特錯的。
要學習python最快的方法,并不是上什么培訓班,看視頻,最快的方法,就是去閱讀python的庫文檔,python手冊。畢竟python雖然在使用上非常難,但是在學習上并不是特別難(相對于java和C++)。
根據(jù)庫的文檔,我們看到to_sql函數(shù)支持兩類mysql引擎一個是sqlalchemy,另一個是sqlliet3.沒錯,在你寫入庫的時候,pymysql是不能用的!??!mysqldb也是不能用的,你只能使用sqlalchemy或者sqlliet3!!鑒于sqllift3已經(jīng)很久沒有更新了,筆者這里建議使用sqlalchemy??!
所以上面那段要改寫成下面這樣:
import pandas as pd
from sqlalchemy import create_engine
conn = create_engine('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')
下面一步很關(guān)鍵,注意?。?!to_sql函數(shù)并不在pd之中,而是在io.sql之中,是sql腳本下的一個類?。?!所以to_sql的最好寫法就是:
pd.io.sql.to_sql(df1,tablename,con=conn,if_exists='repalce')
是不是感覺大功告成了???
那是你的錯覺,趕緊回到數(shù)據(jù)庫看看吧??!你會發(fā)現(xiàn)WTF為什么我原來的數(shù)據(jù)都沒有了?。?/p>
這就是to_sql的第二個坑if_exists字段:
很多新人按照網(wǎng)上的教程,都將if_exists字段定義為‘replace’活著‘fail’,要么發(fā)現(xiàn)原來數(shù)據(jù)沒有了,要么發(fā)現(xiàn)什么時候都沒有做!
麻煩請各位新人仔細閱讀文檔?。?!
fail的意思如果表存在,啥也不做
replace的意思,如果表存在,刪了表,再建立一個新表,把數(shù)據(jù)插入
append的意思,如果表存在,把數(shù)據(jù)插入,如果表不存在創(chuàng)建一個表!!
你看懂了嗎,所以大家一定要讀文檔!讀文檔??!讀文檔!??!