插入MongoDB retuns无法编码对象

时间:2015-04-01 12:22:12

标签: python numpy pandas pymongo blaze

我正在对源自Python pandas DataFrame的本地MongoDB进行相当简单的插入。基本上我正在调用datframe.loc [n] .to_dict()并直接从df获取我的字典。到目前为止,一切都很顺利,直到我尝试插入,我得到了一个“无法编码对象”的对象。查看dict直接显示一切看起来都很好但是然后(在写这个问题时)我突然想到检查dict中的每个类型并发现一个长ID号已经转换为numpy.int64而不是一个简单的int(当我手动创建了dict,因为int会插入很好)。

所以,我无法在pandas文档中找到任何关于向to_dict添加参数的内容,这些参数将允许我覆盖此行为,并且虽然有强力方法来解决此问题,但必须有一些更有说服力的方法排除这个问题而不诉诸于那种事情。

问题是,如何将数据帧的一行转换为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输出。我把它直接复制到了一个'测试' 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,有趣的是,当我进行Mongo插入时,它显示该字段为' Number Long'在文件中。希望这有助于澄清som。

2 个答案:

答案 0 :(得分:3)

查看odo库。特别是the mongodb docs。在不久的将来,熊猫不可能种植任何类型的to_mongo方法,所以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'}]

你可以通过

获得所需的deps和odo
conda install odo pymongo --channel blaze

pip install odo

答案 1 :(得分:-1)

Python整数存储为任意精度数,Mongodb不支持。您需要先将它们转换为普通的int64或字符串对象。当您手动复制&粘贴它可能工作的代码,因为Python解释器将整数正确转换为int64。