Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用pymongo将mongo集合数组获取到python数据帧中_Python_Mongodb_Pandas_Dataframe_Pymongo - Fatal编程技术网

使用pymongo将mongo集合数组获取到python数据帧中

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

当使用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
在此问题上的任何帮助都将不胜感激

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
PS
data
是一个字典列表,其中每个字典代表一个条目/行

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