2015-10-26 6 views
2

Я собираю данные Twitter (твиты + метаданные) на сервер MongoDB. Теперь я хочу сделать некоторый статистический анализ. Для того, чтобы получить данные из MongoDB в кадр данных панды я использовал следующий код:Получение вложенных данных из MongoDB в кадр данных Pandas

cursor = collection.find({},{'id': 1, 'text': 1}) 

tweet_fields = ['id', 'text'] 

result = pd.DataFrame(list(cursor), columns = tweet_fields) 

Этот путь я успешно загрузили данные в панды, который является большим. Теперь я хотел бы сделать некоторый анализ пользователей, которые создали твиты, которые также были собраны мной. Эти данные находятся во вложенной части JSON (я не уверен на 100%, если это правда JSON), например user.id, который является идентификатором учетной записи пользователя Twitter.

Я могу только добавить, что курсор, используя точечную нотацию:

cursor = collection.find({},{'id': 1, 'text': 1, 'user.id': 1}) 

Но это приводит к NaN для этого столбца. Я обнаружил, что проблема заключается в пути структурирован данные:

бит курсора без user.id:

[{'_id': ObjectId('561547ae5371c0637f57769e'), 
    'id': 651795711403683840, 
    'text': 'Video: Zuuuu gut! Caro Korneli besucht für extra 3 Pegida Via KFMW http://t.co/BJX5GKrp7s'}, 
{'_id': ObjectId('561547bf5371c0637f5776ac'), 
    'id': 651795781557583872, 
    'text': 'Iets voor werkloze xenofobe PVV-ers, (en dat zijn waarschijnlijk wel de meeste).........Ze zoeken bij Frontex een paar honderd grenswachten.'}, 
{'_id': ObjectId('561547ab5371c0637f57769c'), 
    'id': 651795699881889792, 
    'text': 'RT @ansichtssache47: Geht gefälligst arbeiten, die #Flüchtlinge haben Hunger! http://t.co/QxUYfFjZB5 #grenzendicht #rente #ZivilerUngehorsa…'}] 

бит курсора с user.id:

[{'_id': ObjectId('561547ae5371c0637f57769e'), 
    'id': 651795711403683840, 
    'text': 'Video: Zuuuu gut! Caro Korneli besucht für extra 3 Pegida Via KFMW http://t.co/BJX5GKrp7s', 
    'user': {'id': 223528499}}, 
{'_id': ObjectId('561547bf5371c0637f5776ac'), 
    'id': 651795781557583872, 
    'text': 'Iets voor werkloze xenofobe PVV-ers, (en dat zijn waarschijnlijk wel de meeste).........Ze zoeken bij Frontex een paar honderd grenswachten.', 
    'user': {'id': 3544739837}}] 

Короче говоря, я не понимаю, как получить вложенную часть моих собранных данных в отдельный столбец моего кадра данных Pandas.

ответ

3

Я использую такую ​​функцию, чтобы вставлять вложенные линии JSON в dataframe. Он использует удобный pandas json.normalize функцию:

import pandas as pd 
from bson import json_util, ObjectId 
from pandas.io.json import json_normalize 
import json 

def mongo_to_dataframe(mongo_data): 

     sanitized = json.loads(json_util.dumps(mongo_data)) 
     normalized = json_normalize(sanitized) 
     df = pd.DataFrame(normalized) 

     return df 

Просто передайте ваши данные Монго путем вызова функции с ним в качестве аргумента.

sanitized = json.loads(json_util.dumps(mongo_data)) загружает JSON строки как регулярное JSON

normalized = json_normalize(sanitized) ип-гнезда в данных

df = pd.DataFrame(normalized) просто превращает его в dataframe

+1

После этого решения я бы загрузить все мои данные, которые хранятся в MongoDB в рамку данных? С объемом данных, которые у меня уже есть, это не похоже на то, что я хочу сделать. Когда я буду использовать то, что вы предлагаете, мне нужно использовать Mongo export для JSON-функции в качестве входных данных для 'mongo_data'? – Lam

+1

Да, как я использую эту функцию, я обычно только запрашиваю mongo для данных, которые мне нужны, и загружать их все в dataframe. Я не уверен, что понимаю вторую часть вашего вопроса, но скажу, что все ваши данные о манго хранятся в переменной 'x'. 'clean_df = mongo_to_dataframe (x)' даст вам фрейм данных в 'clean_df' из неустановленных данных mongo. – metersk

+1

Вы говорите, что запрашиваете только данные, которые вам нужны, прежде чем загружать их в фреймворк данных. Вы имеете в виду, что в моем примере я должен использовать его следующим образом: sanitized = json.loads (json_util.dumps (collection.find ({}, {"id": 1, "text": 1, "user.id": 1}))) EDIT: Это сделал трюк !! И синтаксический анализ текста даже лучше, чем раньше! – Lam

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