优化 Pandas 中基于范围的联接
使用数据帧时,通常需要根据范围条件执行联接。 Pandas 中的一种常见方法是创建一个虚拟列,对其进行联接,然后过滤掉不需要的行。然而,这种解决方案的计算成本可能很高,尤其是对于大型数据集。
幸运的是,有更高效、更优雅的方法来在 Pandas 中实现基于范围的连接。
使用 numpy 广播
最直接的方法是利用 numpy 广播。它涉及将 Pandas 数据帧转换为 numpy 数组,并使用布尔运算来识别匹配的行。
<code class="python">import numpy as np a = A.A_value.values bh = B.B_high.values bl = B.B_low.values i, j = np.where((a[:, None] >= bl) & (a[:, None] <= bh)) pd.concat([ A.loc[i, :].reset_index(drop=True), B.loc[j, :].reset_index(drop=True) ], axis=1)</code>
这种方法非常有效,因为它避免了昂贵的行迭代。
向左扩展连接
要将此解决方案扩展到左连接,我们可以附加数据帧 A 中与数据帧 B 中的任何行都不匹配的剩余行。
<code class="python">pd.concat([ A.loc[i, :].reset_index(drop=True), B.loc[j, :].reset_index(drop=True) ], axis=1).append( A[~np.in1d(np.arange(len(A)), np.unique(i))], ignore_index=True, sort=False )</code>
这可确保所有数据帧 A 中的行包含在结果中,即使它们在数据帧 B 中没有匹配的行。
以上是如何在 Pandas 中高效地执行基于范围的连接?的详细内容。更多信息请关注PHP中文网其他相关文章!