我正在尝试将MongoDB文档转换为矩阵格式
例如
对于这个输入
[ { username: "user1", result: [ { subId: "sub1", marks: 90 }, { subId: "sub4", marks: 92 }, { subId: "sub3", marks: 73 } ] }, { username: "user3", result: [ { subId: "sub3", marks: 87 }, { subId: "sub5", marks: 91 }, { subId: "sub2", marks: 88 } ] }]
输出应该如下所示
sub1 | sub2 | sub3 | sub4 | sub5 | ======|=======|========|========|========|========|user1 | 90 | | 73 | | | user2 | | | | | | user3 | | 88 | 87 | | 91 |
我尝试使用MongoDB聚合、pandas和numpy库来解决这个问题,但没有得到所需的输出。
你能建议我其他方法来实现这个功能吗?
回答:
你需要将每个文档转换为扁平文档(非嵌套)。
所以第一条记录将是这样的:
{'user': 'user1', 'sub1': 90, 'sub4': 92, 'sub3': 73}
现在你可以使用pandas从字典中创建数据框。
这是完整的代码:
doc_list = [ { 'username': "user1", 'result': [ { 'subId': "sub1", 'marks': 90 }, { 'subId': "sub4", 'marks': 92 }, { 'subId': "sub3", 'marks': 73 } ] }, { 'username': "user3", 'result': [ { 'subId': "sub3", 'marks': 87 }, { 'subId': "sub5", 'marks': 91 }, { 'subId': "sub2", 'marks': 88 } ] }]pandas_list = []for doc in doc_list: line = {'user': doc['username']} for sub_mark in doc['result']: line[sub_mark['subId']] = sub_mark['marks'] pandas_list.append(line)df = pd.DataFrame.from_records(pandas_list)