Python 插入MongoDB retuns无法对对象进行编码

Python 插入MongoDB retuns无法对对象进行编码,python,numpy,pandas,pymongo,blaze,Python,Numpy,Pandas,Pymongo,Blaze,我正在做一个相当简单的插入到本地MongoDB中的操作,该MongoDB源于Python数据框架的一部分。本质上,我将datframe.loc[n]调用到_dict()并直接从df获取字典。到目前为止一切都很好,直到我尝试插入,在这里我得到一个“无法编码对象”。直接查看dict表明一切看起来都很好,但是(在写这个问题时)我突然意识到检查dict中的每种类型,发现一个长ID号已转换为numpy.int64,而不是一个简单的int(当我手动创建dict时,作为int可以插入fine) 因此,我在pa

我正在做一个相当简单的插入到本地MongoDB中的操作,该MongoDB源于Python数据框架的一部分。本质上,我将datframe.loc[n]调用到_dict()并直接从df获取字典。到目前为止一切都很好,直到我尝试插入,在这里我得到一个“无法编码对象”。直接查看dict表明一切看起来都很好,但是(在写这个问题时)我突然意识到检查dict中的每种类型,发现一个长ID号已转换为numpy.int64,而不是一个简单的int(当我手动创建dict时,作为int可以插入fine)

因此,我在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。

看看这个库。特别是。Pandas不太可能在不久的将来发展出任何类型的
to_mongo
方法,因此Odo是这种功能应该发展的方向。下面是一个简单的
数据帧的示例:

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'}]
您可以通过执行以下操作获得所需的DEP和odo

conda install odo pymongo --channel blaze


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

您能显示导致错误的数据示例吗?没问题,我已经用数据编辑了问题谢谢Phillip。我还没有完全了解odo库,但无论如何,它在这个例子中发挥了作用。我感谢你的帮助。
pip install odo