2015-04-01 4 views
2

Я делаю довольно простую вставку в локальный MongoDB, полученный из Pandon pandas DataFrame. По сути, я вызываю datframe.loc [n] .to_dict() и получаю свой словарь непосредственно из df. Все хорошо, пока я не попытаюсь вставить, где я получаю «Не могу закодировать объект». Глядя на диктат, я показал, что все выглядело хорошо, но затем (при написании этого вопроса) мне стало ясно, что каждый тип в dict и обнаружил, что длинный идентификационный номер был преобразован в numpy.int64 вместо простого int (который когда Я создал dict вручную, поскольку int будет вставлять штраф).Вставить в MongoDB retuns нельзя закодировать объект

Итак, я не смог найти что-либо в документации 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, который был поврежден при вставке. Я скопировал это прямо в «тест», и это сработало отлично. Если я распечатать значения каждого из dicts я получаю следующее ...

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')] 

Единственное различие (насколько я могу сказать) является Долгий Int, которая достаточно интересно, когда я сделал Монго вставки он показывает это поле как «Number Long» в документе. Надеюсь, эта помощь разъяснит сом.

+0

Можете ли вы показать образец данных, вызывающий ошибку? –

+2

Нет проблем, я отредактировал вопрос с данными – Thatch

ответ

3

Посмотрите на библиотеку odo. В частности, the mongodb docs. В ближайшем будущем Pandas вряд ли вырастет какие-либо методы 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 
+0

Спасибо Филиппу. У меня еще нет моей головы полностью вокруг библиотеки odo, но это было трюк в этом случае независимо. Я ценю вашу помощь. – Thatch

-1

Python целые числа хранятся в виде произвольной точности чисел, которые не поддерживается Мондомбом. Сначала вам нужно преобразовать их в обычные объекты int64 или string. Когда вы вручную копируете &, вставьте код, с которым он работал, вероятно, потому, что интерпретатор Python правильно преобразовал целые числа в int64.

Смежные вопросы