如何不按值而是按值范围合并两个数据框?

时间:2019-03-28 20:39:55

标签: python pandas dataframe

数据框A:

pd.Dataframe({
    'price': [50, 150, 250], 
    'group':[2, 5, 10]
})

数据框B:

pd.Dataframe({
    'low_price': [0, 100, 200], 
    'high_price': [99, 199, 299],
    'low_group':[0, 4, 8],
    'high_group':[3, 6, 12],
    'something':['A', 'B', 'C']
})

如何在以下条件下合并这些数据框:
-数据框B的价格介于之间。
AND
-数据框A的组在数据框B的低组和高组之间。

有没有一种方法可以做到不重复并逐行检查?我已经这样做了,它的成本为O(n ^ 2),不可伸缩。


编辑

PS1:A中的每一行在B中具有0或1个匹配项。我正在寻找“内部”合并。

PS2:A有数百万条记录,B有数百条记录。

2 个答案:

答案 0 :(得分:0)

如果已经对数据进行了排序,那么如果实现某种二进制搜索以查找将数据分区的位置,则可以将其降至O(log n)(假设合并过程所花的时间不超过O(log n))。

如果未对数据进行排序,则最好的办法是O(n),并在发现合并候选者的同时进行合并。

答案 1 :(得分:0)

对于同时进行价格和分组,您不容易做到这一点,但是merge_asof可以一次通过A来加入A对应于每行B的低价格。然后,使用loc查询选择项只会使行满足其他条件。

pd.merge_asof(A, B, left_on='price', right_on='low_price').query(
    '(price<=high_price)&(group>=low_group)&(group<=high_group)')