我经常使用pandas通过范围条件进行合并(join)。
例如,如果有2个数据帧:
A(A_id,A_值)
B(B_id,B_low,B_high,B_name)
它们很大,大小大致相同(假设每个都有2百万条记录)。
我想在A和B之间建立一个内部连接,所以A值应该在B低和B高之间。
使用的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上的每个值应用一个搜索函数,但听起来效率也很低,可能需要索引优化。
是否有更优雅和/或更有效的方法来执行此操作?
我不知道它有多高效,但有人编写了一个包装器,允许您对pandas对象使用SQL语法。那叫pandasql。文档明确声明支持连接。这可能至少更容易阅读,因为SQL语法非常可读。
设置 考虑数据帧
A
和B
numpy
✌最简单的✌方法是使用
numpy
广播。我们寻找
A_value
大于或等于B_low
的每个实例,同时A_value
小于或等于B_high
。为了处理注释并给出类似于左连接的内容,我附加了
A
中不匹配的部分。不确定这是否更有效,但是您可以直接使用sql(例如,来自模块sqlite3)和pandas(灵感来自this question),比如:
您可以根据应用程序的需要调整查询
相关问题 更多 >
编程相关推荐