将嵌套数据从MongoDB获取到Pandas数据框中

时间:2015-10-26 14:12:29

标签: python mongodb twitter pandas

我正在将Twitter数据(推文+元数据)收集到MongoDB服务器中。现在我想做一些统计分析。为了将MongoDB中的数据导入Pandas数据帧,我使用了以下代码:

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

tweet_fields = ['id', 'text']

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

这样我成功地将数据加载到Pandas中,这很棒。现在我想对创建推文的用户进行一些分析,这也是我收集的数据。这个数据位于JSON的嵌套部分(如果这是真正的JSON,我不是100%确定),例如user.id,它是Twitter用户帐户的id。

我可以使用点表示法将其添加到光标:

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数据框的单独列中。

1 个答案:

答案 0 :(得分:5)

我使用这样的函数将嵌套的JSON行放到数据帧中。它使用方便的SELECT r.* FROM (SELECT r.*, MIN(num) OVER (PARTITION BY let, dir) as minnum FROM routes r ) r.* WHERE r.ctry = 'CA'; AND num = minnum; 函数:

pandas json.normalize

只需通过调用函数作为参数传递你的mongo数据。

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 将JSON行加载为常规JSON

sanitized = json.loads(json_util.dumps(mongo_data))取消嵌套数据

normalized = json_normalize(sanitized)只需将其转换为数据框

即可