2015-04-01 47 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。