当使用pymongo将数据从mongo导出到python中的数据帧时,我在使用我想要的格式获取数据时遇到了一些麻烦
我在mongo中的数据如下所示
db.data.findOne()
"_id": ObjectId("581b1b0d077ad53847d27340")
"index" : 0
"item" : {
"bought" : 5.00
"sold" : 7.49
}
然后当我在python中的以下行
pd.DataFrame(list(db.data.find()))
我得到以下
id, index, item
581b1b0d077ad53847d27340 0 {'bought' : '5.00', 'sold' : '7.49'}
虽然我希望结果看起来像
id, index, item.bought, item.sold
581b1b0d077ad53847d27340 0 5.00 7.49
非常感谢任何有关此事的帮助
答案 0 :(得分:3)
IIUC您可以使用json_normalize()方法:
In [78]: d = {
...: "_id": "581b1b0d077ad53847d27340",
...: "index" : 0,
...: "item" : {
...: "bought": 5.00,
...: "sold": 7.49}
...: }
...:
In [79]: pd.io.json.json_normalize(d)
Out[79]:
_id index item.bought item.sold
0 581b1b0d077ad53847d27340 0 5.0 7.49
更新:解析多个条目/行:
In [162]: data = [
...: {"_id": "581b1b0d077ad53847d27340",
...: "index" : 0,
...: "item" : {
...: "bought": 5.00,
...: "sold": 7.49}
...: },
...: {"_id": "581b1b0d077ad53847d21111",
...: "index" : 1,
...: "item" : {
...: "bought": 55.00,
...: "sold": 99.99}
...: },
...: ]
...:
In [163]: pd.io.json.json_normalize(data)
Out[163]:
_id index item.bought item.sold
0 581b1b0d077ad53847d27340 0 5.0 7.49
1 581b1b0d077ad53847d21111 1 55.0 99.99
PS data
是字典列表,其中每个字典代表一个条目/行
UPDATE2:如果MongoDB将item
作为字符串返回"{'bought':5.00,'sold':'7.49'}"
- 我们可以按以下方式预处理数据:
In [168]: from ast import literal_eval
In [169]: data
Out[169]:
[{'_id': '0d', 'item': "{'bought':5.00,'sold':'7.49'}"},
{'_id': '1e', 'item': "{'bought':55.00,'sold':'157.90'}"}]
In [171]: for i,x in enumerate(data):
...: data[i]['item'] = literal_eval(x['item'])
...:
In [172]: data
Out[172]:
[{'_id': '0d', 'item': {'bought': 5.0, 'sold': '7.49'}},
{'_id': '1e', 'item': {'bought': 55.0, 'sold': '157.90'}}]
In [173]: pd.io.json.json_normalize(data)
Out[173]:
_id item.bought item.sold
0 0d 5.0 7.49
1 1e 55.0 157.90
说明:
In [170]: [literal_eval(x['item']) for x in data]
Out[170]: [{'bought': 5.0, 'sold': '7.49'}, {'bought': 55.0, 'sold': '157.90'}]