我经常使用范围条件将pandas用于合并(join).
例如,如果有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
Run Code Online (Sandbox Code Playgroud)
这将非常简单,简短而有效.
同时在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)]
Run Code Online (Sandbox Code Playgroud)
我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)]掩码在B上的每个A值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.
是否有更优雅和/或更有效的方式来执行此操作?