将pandas系列转换为列表,不能作为Pymongo的输入

时间:2015-08-28 17:15:18

标签: python mongodb list pandas pymongo

我有一些存储在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

非常感谢您的任何意见。

2 个答案:

答案 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)

按预期工作。