如何在pymongo中存储和检索pandas数据帧列表?

时间:2015-05-12 12:27:37

标签: python mongodb pandas

我有一个数据框列表。我想将它们存储在mongodb中并检索它。

我试着存储:

for every_df in dfs:
   records = json.loads(every_df.to_json()).values()
   db_connection.insert(records)

但我不确定如何检索。

2 个答案:

答案 0 :(得分:3)

结帐odo。您可以在一行中执行这些操作(追加和检索),即使您有多个DataFrame。这是一个例子:

In [1]: from odo import odo, chunks, resource

In [2]: dfs = (pd.DataFrame({'a': [1, 2, 3], 'b':list('abc')}),
   ...:        pd.DataFrame({'a': [2, 3, 4], 'b':list('def')}))

In [3]: dfs
Out[3]:
(   a  b
 0  1  a
 1  2  b
 2  3  c,    a  b
 0  2  d
 1  3  e
 2  4  f)

In [4]: db = resource('mongodb://localhost/mydb')

In [5]: coll = odo(chunks(pd.DataFrame)(dfs), db.mycollection)

In [6]: list(coll.find())
Out[6]:
[{u'_id': ObjectId('55520638362e690439f13dfb'), u'a': 1, u'b': u'a'},
 {u'_id': ObjectId('55520638362e690439f13dfc'), u'a': 2, u'b': u'b'},
 {u'_id': ObjectId('55520638362e690439f13dfd'), u'a': 3, u'b': u'c'},
 {u'_id': ObjectId('55520638362e690439f13dfe'), u'a': 2, u'b': u'd'},
 {u'_id': ObjectId('55520638362e690439f13dff'), u'a': 3, u'b': u'e'},
 {u'_id': ObjectId('55520638362e690439f13e00'), u'a': 4, u'b': u'f'}]

In [7]: whole_df = odo(coll, pd.DataFrame)

In [8]: whole_df
Out[8]:
   a  b
0  1  a
1  2  b
2  3  c
3  2  d
4  3  e
5  4  f

答案 1 :(得分:1)

您可以使用pymongo中的MongoClientpandas中的to_dict
我将展示一个简单的案例。

必要的模块

import pandas as pd
from pymongo import MongoClient

创建虚拟数据帧

df = pd.DataFrame({'A': ['r,'a','n'], 
                   'Z': ['d','o','m']})

使用to_dict将数据帧转换为dicts的python列表 为什么不to_json?我发现to_dict可以更加一致地处理日期时间对象。

data = df.to_dict(orient='records')

创建mongodb连接器。

cur = MongoClient('mongodb://localhost:27017/')['yourDATABASE']['yourCOLLECTION'] # assume local instance

接下来我们使用insert_many和dicts列表

cur.insert_many(data)

最后我们使用find'yourCOLLECTION'中检索数据作为游标对象。

result = cur.find({})

我们使用list comprehension循环以提取数据作为dicts列表。

result = [r for r in result]

注意:大多数MongoClient集合运算符使用mongodb简单查询格式,所有键都为str