使用pymongo将mongo集合数组获取到python数据帧中
当使用pymongo将数据从mongo导出到python中的数据帧时,我在获取所需格式的数据时遇到了一些问题 我在mongo中的数据如下使用pymongo将mongo集合数组获取到python数据帧中,python,mongodb,pandas,dataframe,pymongo,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.fin
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
在此问题上的任何帮助都将不胜感激IIUC您可以使用以下方法:
更新:解析多个条目/行:
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
PSdata
是一个字典列表,其中每个字典代表一个条目/行
UPDATE2:如果MongoDB以字符串形式返回item
:“{'bunded':5.00,'sall':'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'}]
db.data.find(),Sorry与MaxU
-使用json\u normalize
的想法相同。一次只对一个元素非常有效,但有没有一种快速的方法可以在不使用for循环的情况下对整个数据帧执行此操作?问题是,当我从mongo导出时,“item”字段中的数据周围有QOUTS,因此,对于上面的示例,它将是data=[{bunded:'0d”,“item:{'bunded':5.00,'salled':'7.49'},{bunded':'1e”,“item:{'bunded':55.00,'salled':'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'}]