首页  >  文章  >  后端开发  >  如何使用 Numpy 广播按 Pandas 中的范围条件合并数据帧?

如何使用 Numpy 广播按 Pandas 中的范围条件合并数据帧?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-31 09:33:01189浏览

How to Merge DataFrames by Range Condition in Pandas Using Numpy Broadcasting?

在 Pandas 中按范围条件合并数据帧

在数据分析领域,组合来自多个源的数据是一项常见任务。 Pandas 是一个强大的数据操作 Python 库,提供了各种合并数据帧的方法,包括范围条件。本文深入研究了这个特定场景,并提出了使用 numpy 广播的有效解决方案。

问题描述

给定两个数据帧 A 和 B,目标是执行内部联接,其中数据帧 A 中的值落在数据帧 B 中定义的特定范围内。传统上,这可以使用 SQL 语法来实现:

<code class="sql">SELECT *
FROM A, B
WHERE A_value BETWEEN B_low AND B_high</code>

现有解决方案

Pandas 提供了一种使用虚拟列的解决方法,合并虚拟列,然后过滤掉不需要的行。然而,这种方法的计算量很大。或者,可以对 B 上的每个 A 值应用搜索函数,但这种方法也有缺点。

Numpy 广播:一种实用方法

Numpy 广播提供了一种优雅高效的解决方案。该技术利用矢量化对整个数组而不是单个元素执行计算。要实现所需的合并:

  1. 从数据帧 A 和 B 中提取值。
  2. 使用 numpy 广播创建布尔掩码:

    • A_value >= B_low
    • A_value
  3. 使用 numpy 的 np.where 来定位 mask 为 True 的索引。
  4. 连接根据识别的索引从数据帧 A 和 B 中获取相应的行。

这种方法利用广播对整个 A 数据帧执行范围比较,显着减少计算时间和复杂性。

示例

考虑以下数据帧:

<code class="python">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]
))</code>

输出:

   A_id  A_value  B_high  B_id  B_low
0     0        5      10     0      0
1     3       35      40     1     30
2     3       35      50     2     30
3     4       45      50     2     30

此输出演示了成功根据指定范围条件合并数据帧 A 和 B。

其他注意事项

要执行左连接,请在输出中包含数据帧 A 中不匹配的行。这可以通过使用 numpy 的 ~np.in1d 来识别不匹配的行并将其附加到结果中来实现。

总之,numpy 广播提供了一种基于范围条件合并数据帧的强大且高效的方法。其矢量化功能提高了性能,使其成为大型数据集的理想解决方案。

以上是如何使用 Numpy 广播按 Pandas 中的范围条件合并数据帧?的详细内容。更多信息请关注PHP中文网其他相关文章!

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