【问题标题】:Getting nested data from MongoDB into a Pandas data frame将嵌套数据从 MongoDB 获取到 Pandas 数据框中
【发布时间】:2016-01-25 16:18:48
【问题描述】:

我正在将 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 的嵌套部分(我不能 100% 确定这是否是真正的 JSON),例如 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 数据框的单独列中。

【问题讨论】:

    标签: python mongodb twitter pandas


    【解决方案1】:

    我使用这样的函数将嵌套的 JSON 行放入数据框中。它使用方便的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
    

    只需通过调用函数并将其作为参数传递您的 mongo 数据。

    sanitized = json.loads(json_util.dumps(mongo_data)) 将 JSON 行加载为常规 JSON

    normalized = json_normalize(sanitized) 取消嵌套数据

    df = pd.DataFrame(normalized) 只是把它变成一个数据框

    【讨论】:

    • 按照这个解决方案,我会将存储在 MongoDB 中的所有数据加载到数据框中,对吗?有了我已经拥有的大量数据,这似乎不是我想做的事情。当我使用您的建议时,我是否需要使用 Mongo 导出到 JSON 函数作为“mongo_data”的输入?
    • 是的,我使用这个函数的方式,我通常只在 mongo 中查询我需要的数据并将其全部加载到数据框中。我不确定我是否理解你问题的第二部分,但说你所有的 mongo 数据都存储在一个变量 x 中。 clean_df = mongo_to_dataframe(x) 将在 clean_df 中为您提供未嵌套的 mongo 数据的数据框。
    • 您说您只在将数据加载到数据框之前查询您需要的数据。你的意思是在我的例子中我应该如下使用它:sanitized = json.loads(json_util.dumps(collection.find({},{"id": 1, "text": 1, "user.id": 1}))) 编辑:这成功了!!而且文本解析比以前更好!
    • 上帝保佑你!!
    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2016-10-26
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多