使用pymongo

时间:2016-11-03 12:04:47

标签: python mongodb pandas dataframe pymongo

当使用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

非常感谢任何有关此事的帮助

1 个答案:

答案 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'}]