首页  >  文章  >  后端开发  >  如何在 Pandas 中高效地执行基于范围的连接?

如何在 Pandas 中高效地执行基于范围的连接?

Linda Hamilton
Linda Hamilton原创
2024-11-02 00:19:02646浏览

How to Efficiently Perform Range-Based Joins in Pandas?

优化 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn