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

Pandas不同大小DataFrame按标签和区间匹配填充数据的问题

Pandas跨DataFrame区间匹配解决方案

你之前的代码报错是因为np.where默认按行对齐逐元素比较,两个DataFrame长度不一致时会触发广播错误,也无法实现多对多的区间匹配逻辑,以下是支持非整数步长的高性能实现方案:

方法1:IntervalIndex映射方案(性能最优)

核心思路是按Labels分组后为每个标签的区间集合构建IntervalIndex索引,直接映射匹配值,避免全量循环,适合大数据量场景:

import pandas as pd

# 第一步:构建标签->区间索引的映射字典
label_interval_map = {}
for label, group in df2.groupby('Labels'):
    # closed参数设置区间开闭规则,示例中值2属于[0,2],因此设置为'both',可按需调整为left/right/neither
    interval_idx = pd.IntervalIndex.from_arrays(group['From'], group['To'], closed='both')
    label_interval_map[label] = pd.Series(group['Data'].values, index=interval_idx)

# 第二步:为df1匹配Data值
# 数据量中等场景可以用apply实现
df1['Data'] = df1.apply(
    lambda row: label_interval_map[row['Labels']].get(row['Interval'], pd.NA),
    axis=1
)

# 超大数据量可以用分组优化版,速度提升数倍
def match_group_interval(group, interval_map):
    return interval_map[group.name].reindex(group['Interval']).values
df1['Data'] = df1.groupby('Labels', group_keys=False).apply(
    match_group_interval,
    interval_map=label_interval_map
)

方法2:条件关联方案(逻辑直观)

如果数据量不大,也可以用关联+过滤的方式实现,逻辑更易理解:

# 先按Labels字段做全量关联
temp = df1.merge(df2, on='Labels', how='left')
# 过滤出Interval落在[From, To]区间内的有效行
temp = temp[(temp['Interval'] >= temp['From']) & (temp['Interval'] <= temp['To'])]
# 合并结果回df1
df1 = df1.merge(temp[['Labels', 'Interval', 'Data']], on=['Labels', 'Interval'], how='left')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:57:05