2015-04-01 46 views
2

我正在做一個相當簡單的插入到來自Python熊貓DataFrame的本地MongoDB。基本上我調用datframe.loc [n] .to_dict()並直接從df獲取我的字典。到目前爲止,所有的都很好,直到我嘗試插入,我得到'無法編碼對象'。看直接表明,一切看起來不錯,但後來(寫這個問題時)它使我想檢查在字典中的每種類型,並發現一個長的ID號已轉換爲numpy.int64,而不是一個簡單的int(當我手動創建了dict,因爲int會插入正確)。插入到MongoDB retuns無法編碼對象

因此,我無法在熊貓文檔中找到任何關於向to_dict添加參數的內容,這將允許我重寫此行爲,並且有強力方法來解決此問題,但必須有更多雄辯的方式在不訴諸於此類事情的情況下對這個問題進行分類。

問題是,如何將一行數據框轉換爲字典插入到MongoDB,確保我只使用可接受的內容類型...或者,我可以在這裏進一步備份並使用更簡單的方法讓數據框的每一行成爲Mongo內的文檔?

感謝

按照要求,這裏是一個增編後與我使用的數據樣本。

{'Account Created': 'about 3 hours ago', 
'Followers': 13, 
'Following': 499, 
'Screen Name': 'XXXXXXXXXX', 
'Status': 'Alive', 
'Tweets': 12, 
'Twitter ID': 0000000000L} 

這直接來自插入時發生故障的to_dict輸出。我直接將其複製到「測試」字典中,並且工作得很好。如果我打印出每個類型的字典,我得到以下的值...

to_dict = ['Alive', 'a_aheref77', 'about 3 hours ago', 12, 13, 499, 0000000000L, ObjectId('551bd8cfae89e9370851aa64')] 

test = ['Alive', 'XXXXXXXX', 'about 3 hours ago', 499, 13, 12, 0000000000, ObjectId('551bd6fdae89e9370851aa63')] 

唯一的區別(據我可以告訴)是long int類型,其中有趣的是,當我做了蒙戈插入它將該字段顯示爲文檔中的「Number Long」。希望這個幫助澄清索姆。

+0

你可以顯示一個數據的例子是導致錯誤? – 2015-04-01 13:03:44

+2

沒問題,我用數據編輯了問題 – Thatch 2015-04-01 13:48:04

回答

3

看看odo庫。特別是,the mongodb docs。在不久的將來,熊貓不可能種植任何種類的方法,所以Odo就是這種功能應該去的地方。這裏有一個簡單的DataFrame一個例子:

In [13]: import pandas as pd 

In [14]: from odo import odo 

In [15]: df = pd.DataFrame({'a': [1, 2, 3], 'b': list('abc')}) 

In [17]: m = odo(df, 'mongodb://localhost/db::t') 

In [18]: list(m.find()) 
Out[18]: 
[{u'_id': ObjectId('551bfb20362e696200d568d9'), u'a': 1, u'b': u'a'}, 
{u'_id': ObjectId('551bfb20362e696200d568da'), u'a': 2, u'b': u'b'}, 
{u'_id': ObjectId('551bfb20362e696200d568db'), u'a': 3, u'b': u'c'}] 

您可以通過

conda install odo pymongo --channel blaze 

獲得所需的DEPS和ODO
pip install odo 
+0

謝謝菲利普。我還沒有完全掌握odo庫,但是它在這個例子中不管用。我感謝您的幫助。 – Thatch 2015-04-02 06:09:37

-1

Python的整數存儲爲任意精度的數字, Mongodb不支持。您需要先將它們轉換爲正常的int64或字符串對象。當您手動複製&時,粘貼其工作的代碼可能是因爲Python解釋器將整數正確地轉換爲int64。