You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于二维区间条件的Pandas数据查找实现方案咨询

问题描述

我有一个包含两列数值的Pandas DataFrame,结构如下:

col1col2
2.54.1
5.12.2
3.07.8

同时还有一个二维参考DataFrame:

03510
0ADE
5BFG
10CHI

需要为第一个DataFrame的每一行,按照以下规则在第二个表中匹配对应值:

  • col1处于参考表行索引的区间内
  • col2处于参考表列名的区间内

匹配逻辑细节:找到小于等于col1的最大参考表行索引,同时找到小于等于col2的最大参考表列名,取对应位置的值。

期望输出为新增col3的DataFrame:

col1col2col3
2.54.1A
5.12.2B
3.07.8D

由于参考表规模较大且可能变动,不考虑用if语句实现,求最优解决方案。我曾考虑将参考表转换为带双重索引的一维结构。


最优解决方案

核心思路是利用Pandas+NumPy的向量化区间匹配工具,快速定位每个值对应的参考表行/列,再提取对应值。该方案无需硬编码区间,适配参考表的动态变化。

步骤1:准备初始数据

import pandas as pd
import numpy as np

# 目标DataFrame
df = pd.DataFrame({
    'col1': [2.5, 5.1, 3.0],
    'col2': [4.1, 2.2, 7.8]
})

# 参考DataFrame(确保行索引和列名为数值类型)
ref_df = pd.DataFrame(
    [['A', 'D', 'E'], ['B', 'F', 'G'], ['C', 'H', 'I']],
    index=[0, 5, 10],
    columns=[0, 3, 5, 10]
)

步骤2:匹配参考表的行索引与列名

用np.digitize快速定位每个值对应的区间位置:

# 提取参考表的行索引和列名(需保证为有序数值)
row_indices = ref_df.index.values
col_names = ref_df.columns.values

# 匹配col1对应的参考行索引:找到小于等于col1的最大索引
row_pos = np.digitize(df['col1'], row_indices, right=True) - 1
row_pos = np.maximum(row_pos, 0)  # 处理值小于最小索引的边界情况
matched_rows = row_indices[row_pos]

# 匹配col2对应的参考列名:找到小于等于col2的最大列名
col_pos = np.digitize(df['col2'], col_names, right=True) - 1
col_pos = np.maximum(col_pos, 0)
matched_cols = col_names[col_pos]

步骤3:提取匹配值并合并

用lookup方法快速提取参考表对应位置的值:

df['col3'] = ref_df.lookup(matched_rows, matched_cols)

运行后得到的df即为期望输出:

col1  col2 col3
0   2.5   4.1    A
1   5.1   2.2    B
2   3.0   7.8    D

方案优势

  • 动态适配:只要参考表的行索引和列名为有序数值,无需修改代码即可处理规模扩大或区间调整的情况
  • 高效快速:基于NumPy向量化操作,比循环/if语句效率高几个数量级,适合大规模数据
  • 逻辑清晰:直接对应Excel的区间匹配逻辑,易于维护和理解

内容的提问来源于stack exchange,提问作者Lukas Tomek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:42:43