我有一些存储在panda DataFrame中的数据,我想用一个由DataFrame中的单个系列构建的列表来查询我的MongoDB。当我使用.tolist()
或函数list()
转换系列时,我显然会得到一个列表,但是当我在Pymongo查询中输入此列表时,我收到错误:
bson.errors.InvalidDocument: Cannot encode object: <the first value of the list>
以下是重现错误的示例:
首先创建一个Mongo数据库:
from pymongo import MongoClient
import pandas as pd
db = MongoClient().test
db.collection.insert_many([{'key_x':1},{'key_x':2},{'key_x':3}])
然后我在数据库中查询key_x
在[1,3]中的文档:
x_list = [1,3]
for doc in db.collection.find({'key_x':{'$in': x_list}}):
print doc
正如预期的那样,没有错误,并且两个条目{'key_x':2}
和{'key_x':3}
都会打印到控制台。
现在我尝试首先将列表转换为Pandas系列并转换回列表。
ser = pd.Series([1,3])
x_list = ser.tolist()
print type(x_list) #Checking to see if it is indeed a list
> <type 'list'>
for doc in db.collection.find({'key_x':{'$in': x_list}}):
print doc
然后打印此错误消息:
>bson.errors.InvalidDocument: Cannot encode object: 1
非常感谢您的任何意见。
答案 0 :(得分:2)
不同的行为来自不同类型的列表元素:
# first example
type(x_list[0])
int
# second example
type(x_list[0])
numpy.int64
解决此问题的一种方法是使用ser.values.tolist()
代替ser.tolist()
。显然,大熊猫tolist()
的表现与numpy不同。
答案 1 :(得分:1)
问题是pandas返回np.int64
个对象的列表,而不是内置的int
个对象。
In [50]: ser = pd.Series([1,3])
In [51]: type(ser.tolist()[0])
Out[51]: numpy.int64
以下
ser = pd.Series([1,3])
x_list = [int(i) for i in ser.tolist()]
for doc in db.test.find({'key_x':{'$in': x_list}}):
print(doc)
按预期工作。