【发布时间】:2017-11-06 03:38:55
【问题描述】:
我经常使用 pandas 通过范围条件进行合并(连接)。
例如,如果有 2 个数据框:
A(A_id,A_value)
B(B_id、B_low、B_high、B_name)
它们很大且大小大致相同(假设每个记录 2M 条)。
我想在 A 和 B 之间进行内部连接,因此 A_value 将在 B_low 和 B_high 之间。
使用 SQL 语法:
SELECT *
FROM A,B
WHERE A_value between B_low and B_high
这将非常简单、简短且高效。
同时,在 pandas 中,唯一的方法(我发现没有使用循环)是在两个表中创建一个虚拟列,加入它(相当于交叉加入),然后过滤掉不需要的行。这听起来沉重而复杂:
A['dummy'] = 1
B['dummy'] = 1
Temp = pd.merge(A,B,on='dummy')
Result = Temp[Temp.A_value.between(Temp.B_low,Temp.B_high)]
我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)] 掩码对 B 上的每个 A 值应用搜索功能,但这听起来效率也很低,可能需要优化索引。
是否有更优雅和/或更有效的方式来执行此操作?
【问题讨论】:
-
This Q&A 可能是相关的。
-
看起来他们使用的方法与我自己建议的方法相似(虚拟列、笛卡尔积和掩码过滤器)。令人惊讶的是没有内置解决方案。
-
您是否还查看了接受的答案...?永远不要从 Stack Overflow 上的问题中学习。虽然我可能没有意识到答案是一样的,但在这种情况下很抱歉:)
-
看起来像是一个更优化内存的解决方案,但 - 一点也不优雅:(谢谢!
-
嗯,是的,
merge不接受任何函数参数这一事实表明,可能无法提供优雅的解决方案。但我几乎不了解熊猫,所以让我们希望专家出现并证明相反的情况:)