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

Converting pandas series to a list, is not working as input to Pymongo

我有一些数据存储在熊猫 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

非常感谢您的任何意见。

问题是 pandas 是 return 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)

按预期工作。

不同类型的列表的元素产生了不同的行为:

# first example
type(x_list[0])
int
# second example
type(x_list[0])
numpy.int64

修复它的一种方法是使用 ser.values.tolist() 而不是 ser.tolist()。显然,pandas tolist() 的行为与 numpy 的不同。