2013-01-21 83 views
1

我試圖將回歸的結果寫回MySQL,但是在遍歷擬合值並獲取NaNs寫入爲空值時出現問題。本來,我做了反覆這樣說:迭代並將熊貓Dataframe NaNs寫回到MySQL

for i in dataframe: 
    cur = cnx.cursor() 
    query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(dataframe['yhat'].__str__())+" where timecount="+(datafrane['timecount'].__str__())+";") 
    cur.execute(query) 
    cnx.commit() 
    cur.close() 

.....這說SQL thew回我:

"mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NaN' 

所以,我一直在試圖通過篩選出的NaN只要求Python的時候yhat不等於NaN的承諾:

for i in dataframe: 
    if cleandf['yhat']>(-1000): 
     cur = cnx.cursor() 
     query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(dataframe['yhat'].__str__())+" where timecount="+(datafrane['timecount'].__str__())+";") 
     cur.execute(query) 
     cnx.commit() 
     cur.close() 

但後來我得到這個:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

所以,我儘量避開它與這在我上面的語法:

if cleandf['yhat'][i]>(-1000): 

但當時得到這樣的:

ValueError: Can only tuple-index with a MultiIndex 

然後嘗試添加itterows()同時爲:

for i in dataframe.iterrows(): 
     if cleandf['yhat'][i]>(-1000): 

但是得到與上面相同的問題。

我不知道我在做什麼錯在這裏,但假設它是在Pandas DataFrames中迭代的東西。但是,即使我獲得了正確的迭代,我也希望將Null寫入NaN出現的SQL中。

那麼,你覺得我應該怎麼做?

+0

您是否嘗試過使用'write_frame'和'read_frame',就像在[這個答案](http://stackoverflow.com/questions/14431646/how-to-write-pandas-dataframe-to-sqlite-with-指數/ 14432914#14432914)? –

回答

2

我沒有一個完整的答案,但也許我有一些提示可能會有所幫助。我相信你正在考慮你的dataframe作爲一個類似於SQL記錄集的對象。

for i in dataframe 

這將遍歷數據框中的列名稱字符串。 i將採用列名稱,而不是行。

dataframe['yhat'] 

這將返回一個整列(pandas.Series,這是一個numpy.ndarray),而不是一個單一的值。因此:

dataframe['yhat'].__str__() 

將提供整個列的字符串表示形式,供人閱讀。它當然不是一個可以轉換爲查詢字符串的值。

if cleandf['yhat']>(-1000) 

這給出了一個錯誤,因爲再次,cleandf['yhat']是值的整個陣列,而不只是一個單一的值。把它看作整個列,而不是單行的值。

if cleandf['yhat'][i]>(-1000): 

這是越來越近了,但真要i到這裏來的整數,而不是另一列名。

for i in dataframe.iterrows(): 
    if cleandf['yhat'][i]>(-1000): 

使用iterrows對您來說似乎是對的。但是,i會佔用每行的值,而不是可以索引到列中的整數(cleandf['yhat']是完整列)。

此外,請注意,熊貓有更好的方法來檢查缺失的值比依靠一個巨大的負數。嘗試是這樣的:

non_missing_index = pandas.isnull(dataframe['yhat']) 
cleandf = dataframe[non_missing_index] 
for row in cleandf.iterrows(): 
    row_index, row_values = row 
    query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(row_values['yhat'].__str__())+" where timecount="+(row_values['timecount'].__str__())+";") 
    execute_my_query(query) 

您可以實現execute_my_query比我好的人,我期待。但是,這個解決方案並不是你想要的。你真的想遍歷所有的行並做兩種類型的插入。試試這個:

for row in dataframe.iterrows(): 
    row_index, row_values = row 
    if pandas.isnull(row_values['yhat']): 
     pass # populate the 'null' insert query here 
    else: 
     query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(row_values['yhat'].__str__())+" where timecount="+(row_values['timecount'].__str__())+";") 
    execute_my_query(query) 

希望它有幫助。

+0

太棒了。很有幫助。如果我還有其他問題,我會通知你。 – user1784454