我有一个数据框列表。我想将它们存储在mongodb中并检索它。
我试着存储:
for every_df in dfs:
records = json.loads(every_df.to_json()).values()
db_connection.insert(records)
但我不确定如何检索。
答案 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
中的MongoClient
和pandas
中的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
。