Lam*_*Lam 2 python twitter mongodb pandas
我正在将Twitter数据(推文+元数据)收集到MongoDB服务器中。现在我想做一些统计分析。为了将数据从MongoDB获取到Pandas数据框中,我使用了以下代码:
cursor = collection.find({},{'id': 1, 'text': 1})
tweet_fields = ['id', 'text']
result = pd.DataFrame(list(cursor), columns = tweet_fields)
Run Code Online (Sandbox Code Playgroud)
这样,我成功地将数据加载到了Pandas中,这很棒。现在,我想对创建推文的用户进行一些分析,这些推文也是我收集的数据。此数据位于JSON的嵌套部分中(我不确定100%是否为true JSON),例如user.id(这是Twitter用户帐户的ID)。
我可以使用点符号将其添加到光标中:
cursor = collection.find({},{'id': 1, 'text': 1, 'user.id': 1})
Run Code Online (Sandbox Code Playgroud)
但这会导致该列的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…'}]
Run Code Online (Sandbox Code Playgroud)
带有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}}]
Run Code Online (Sandbox Code Playgroud)
简而言之,我不明白如何在Pandas数据框的单独列中获取所收集数据的嵌套部分。
我使用这样的函数将嵌套的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
Run Code Online (Sandbox Code Playgroud)
只需通过将其作为参数调用函数来传递mongo数据即可。
sanitized = json.loads(json_util.dumps(mongo_data))
将JSON行作为常规JSON加载
normalized = json_normalize(sanitized)
取消嵌套数据
df = pd.DataFrame(normalized)
只需将其转换为数据框
归档时间: |
|
查看次数: |
2804 次 |
最近记录: |