我经常使用 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)]
掩码在每个 A 值上应用 B 上的搜索函数,但这听起来效率也很低,可能需要索引优化。
是否有更优雅和/或更有效的方式来执行此操作?
原文由 Dimgold 发布,翻译遵循 CC BY-SA 4.0 许可协议
设置
考虑数据帧
A
和B
numpy
✌ 最简单✌的方法是使用
numpy
广播。We look for every instance of
A_value
being greater than or equal toB_low
while at the same timeA_value
is less than or equal toB_high
。为了解决评论并提供类似于左连接的内容,我附加了
A
不匹配的部分。