将 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 的不同。
我有一些数据存储在熊猫 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 的不同。