【问题标题】:Efficient Intersection of pandas dataframe with remote mongodb?熊猫数据框与远程 mongodb 的有效交集?
【发布时间】:2019-02-26 20:14:36
【问题描述】:

我的本​​地机器上有一个 python pandas 数据框,并且可以访问一个远程 mongodb 服务器,该服务器具有可以通过 pymongo 查询的其他数据。

如果我的本地数据框很大,例如 40k 行,每行 3 列,那么检查本地数据框的特征与包含数百万个文档的远程集合的交集最有效的方法是什么?

我在这里寻求一般建议。我认为我可以从 3 个特性中的每一个中获取一个不同的值列表,并在 $or find 语句中使用这些值,但是如果我有 90k 个不同的值用于 3 个特性之一,这似乎是个坏主意。

因此,任何意见都将受到欢迎。我无权将本地数据框插入远程服务器,我只有选择/查找权限。

非常感谢!

【问题讨论】:

    标签: python mongodb pandas pymongo


    【解决方案1】:

    正如您已经解释过的,您将无法插入数据。所以唯一可行的方法是首先将唯一值放入列表中。df['column_name'].unique()。然后您可以在.find() 方法中使用$in 运算符并将您的列表作为参数传递。如果需要时间或太多。然后将您的列表分成相等的块,我的意思是列表 [[id1, id2, id3], [id4, id5, id6] ... ] 并执行 for 循环 for sub-list in list: db.xyz.find({'key':{'$in': sublist}}, {'_id': 1}) 并使用子列表作为 $in 运算符中的参数。然后对于每次迭代,如果值存在于数据库中,它将返回_id,我们可以轻松地将其存储在一个空列表中并附加它,我们将能够在值存在于收藏。

    所以这就是我会做的事情。不一定是最好的。

    【讨论】:

    • 感谢您的建议!我尝试使用每个特征的不同值并使用 $in 中的值,以便将子集提取到数据帧中,然后我可以使用 pandas intersect 来查找匹配的行 - 我没有考虑的是不同的集合一个特征的值足以有效地查询远程集合中的每个文档。所以最后我只为这 3 个功能中的每一个使用了一个 $and,并且只是用每行一个查询来锤击 mongodb 服务器。它确实有效,我只是不喜欢这样做,因为它只是感觉不是一个好方法。但再次感谢!
    猜你喜欢
    • 2018-01-23
    • 2021-12-01
    • 2017-03-24
    • 1970-01-01
    • 2020-07-05
    • 2021-06-02
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多