设置
考虑数据帧
A和
B
A = pd.Dataframe(dict( A_id=range(10), A_value=range(5, 105, 10) ))B = pd.Dataframe(dict( B_id=range(5), B_low=[0, 30, 30, 46, 84], B_high=[10, 40, 50, 54, 84] ))A A_id A_value0 0 51 1 152 2 253 3 354 4 455 5 556 6 657 7 758 8 859 9 95B B_high B_id B_low0 10 0 01 40 1 302 50 2 303 54 3 464 84 4 84
numpy
最 简单的 方法是使用
numpy广播。
我们找的每一个实例
A_value大于或等于
B_low,而在同一时间
A_value小于或等于
B_high。
a = A.A_value.valuesbh = B.B_high.valuesbl = B.B_low.valuesi, j = np.where((a[:, None] >= bl) & (a[:, None] <= bh))pd.Dataframe( np.column_stack([A.values[i], B.values[j]]), columns=A.columns.append(B.columns)) A_id A_value B_high B_id B_low0 0 5 10 0 01 3 35 40 1 302 3 35 50 2 303 4 45 50 2 30
为了解决评论并提供类似于左联接的内容,我添加了
A不匹配的部分。
pd.Dataframe( np.column_stack([A.values[i], B.values[j]]), columns=A.columns.append(B.columns)).append( A[~np.in1d(np.arange(len(A)), np.unique(i))], ignore_index=True, sort=False) A_id A_value B_id B_low B_high0 0 5 0.0 0.0 10.01 3 35 1.0 30.0 40.02 3 35 2.0 30.0 50.03 4 45 2.0 30.0 50.04 1 15 NaN NaN NaN5 2 25 NaN NaN NaN6 5 55 NaN NaN NaN7 6 65 NaN NaN NaN8 7 75 NaN NaN NaN9 8 85 NaN NaN NaN10 9 95 NaN NaN NaN



