在使用sqlalchemy 進行pandas與數據庫交互時遇到一個問題:
import pandas as pd
import sqlalchemy as sqls
engine = sqls.create_engine('mysql+pymysql://root:[email protected]:3306/spiders')
sql = 'select * from user_temp'
df1 = pd.read_sql_query(sql, engine)
從df1中取出一行,修改下,在作爲新記錄插入會數據表中。
In [20]: df2 = df1.loc[1]
In [21]: df2.id = 4
In [22]: df2
Out[22]:
id 4
name 李四
Name: 1, dtype: object
In [26]: df2.to_sql('user_temp', engine, index= False,if_exists='append')
In [26]: type(df2)
Out[26]: pandas.core.series.Series
結果報錯:
在stackoverflow 看到一個問題,AttributeError: ‘Series’ object has no attribute ‘to_sql’
原文:https://stackoverflow.com/questions/29707002/attributeerror-series-object-has-no-attribute-to-sql#
所以,就將Series 轉換成 DataFrame,Series 有自帶的方法to_frame()可以進行轉換。
In [28]: df2 = df1.loc[1].to_frame()
In [29]: type(df2)
Out[29]: pandas.core.frame.DataFrame
In [30]: df2
Out[30]:
1
id 4
name 李四
在插入一次,結果還是報錯
看下報錯內容:(1054, “Unknown column ‘1’ in ‘field list’”),而df2的columns就是“1”,所以纔是提示錯誤,猜測to_sql會讀取dataframe的columns屬性,並與表中字段對應。
將to_frame()轉換得到的結果中,index就可以與表中字段對應,於是將df2轉置下,交換下index與columns。
In [12]: df3 = pd.DataFrame(df2.values.T,columns=df2.index)
In [13]: df3
Out[13]:
id name
0 4 李四
In [20]: df3.to_sql('user_temp', engine, index= False,if_exists='append')
記錄成功插入到數據庫中。
總結下,Series 轉換成 DataFrame 可以使用to_frame()後,再轉置index與columns
In [21]: df2 = df1.loc[1].to_frame()
In [22]: df2
Out[22]:
1
id 2
name 李四
In [23]: df3 = pd.DataFrame(df2.values.T,columns=df2.index)
In [24]: df3
Out[24]:
id name
0 2 李四
In [25]: df1
Out[25]:
id name
0 1 張三
1 2 李四
2 3 王五
若有錯誤之處,歡迎評論指出,互相學習。