我有一个 MongoDB 中嵌套层次较深的文档集合,想要将其展开并导入到 Pandas 中。其中有一些嵌套字典,但也有一组字典列表,我希望将其转换为列(详见下面的示例)。
我已经有一个用于较小批量文档的函数。但是解决方案(我在这个问题的回答中找到它)使用了 json。
我尝试过许多建议使用其他 json 解析器(例如 ijson)的解决方案,但出于不同的原因,它们都没有解决我的问题。如果我想通过 json 保持转换,唯一剩下的方法就是将较大的选择分成更小的文档组,并迭代解析。
此时我想,也就是我主要的问题——也许有一种更聪明的方法来完成展开而不需要通过 json 直接在 MongoDB 或 Pandas 中进行操作或以某种组合方式?
这是缩短后的示例 Doc:
这是一个成功的数据框架表示方式(为了易读性,我跳过了“_id”和“sId”列):
我已经有一个用于较小批量文档的函数。但是解决方案(我在这个问题的回答中找到它)使用了 json。
json.loads
操作的问题是,在从 Collection 中选择更多数据时会因为 MemoryError
而失败。我尝试过许多建议使用其他 json 解析器(例如 ijson)的解决方案,但出于不同的原因,它们都没有解决我的问题。如果我想通过 json 保持转换,唯一剩下的方法就是将较大的选择分成更小的文档组,并迭代解析。
此时我想,也就是我主要的问题——也许有一种更聪明的方法来完成展开而不需要通过 json 直接在 MongoDB 或 Pandas 中进行操作或以某种组合方式?
这是缩短后的示例 Doc:
{
'_id': ObjectId('5b40fcc4affb061b8871cbc5'),
'eventId': 2,
'sId' : 6833,
'stage': {
'value': 1,
'Name': 'FirstStage'
},
'quality': [
{
'type': {
'value': 2,
'Name': 'Color'
},
'value': '124'
},
{
'type': {
'value': 7,
'Name': 'Length'
},
'value': 'Short'
},
{
'type': {
'value': 15,
'Name': 'Printed'
}
}
}
这是一个成功的数据框架表示方式(为了易读性,我跳过了“_id”和“sId”列):
eventId stage.value stage.name q_color q_length q_printed
1 2 1 'FirstStage' 124 'Short' 1
目前我的代码(遇到了内存问题-请参阅上文):
def load_events(filter = 'sId', id = 6833, all = False):
if all:
print('Loading all events.')
cursor = events.find()
else:
print('Loading events with %s equal to %s.' %(filter, id))
print('Filtering...')
cursor = events.find({filter : id})
print('Loading...')
l = list(cursor)
print('Parsing json...')
sanitized = json.loads(json_util.dumps(l))
print('Parsing quality...')
for ev in sanitized:
for q in ev['quality']:
name = 'q_' + str(q['type']['Name'])
value = q.pop('value', 1)
ev[name] = value
ev.pop('quality',None)
normalized = json_normalize(sanitized)
df = pd.DataFrame(normalized)
return df
events
未定义。 - Dr Fabio Gori