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

如何基于另一DataFrame的数值范围匹配填充entity列?

基于数值范围匹配两个DataFrame的实现方案

先定义示例数据

首先把你给出的两个DataFrame用代码还原:

import pandas as pd

# 第一个DataFrame
df1 = pd.DataFrame({
    'value': ['a', 'b', 'c', 'd', 'e'],
    'id': [1, 2, 5, 8, 11]
})

# 第二个DataFrame(范围匹配表)
df2 = pd.DataFrame({
    'entity': ['ABC', 'DEF', 'XYZ'],
    'start_range': [1, 4, 8],
    'end_range': [3, 7, 15]
})

方法一:区间索引匹配(简洁直观)

利用Pandas的IntervalIndex把范围转成可匹配的区间索引,直接通过索引映射获取对应entity:

# 从start_range和end_range创建闭区间索引(包含边界值)
interval_index = pd.IntervalIndex.from_arrays(
    df2['start_range'], 
    df2['end_range'], 
    closed='both'
)

# 将df2设置为区间索引,通过df1的id匹配对应的entity
df1['entity'] = df2.set_index(interval_index).loc[df1['id'], 'entity'].values

# 查看结果
print(df1)

运行后会直接得到你想要的结果,这种方式代码简洁,逻辑清晰,适合中小规模数据集。


方法二:merge_asof匹配(高效适用于大数据)

如果你的数据集行数较多,merge_asof是更高效的选择,它通过近似匹配实现范围关联:

# 先对范围表按start_range排序(merge_asof要求右侧DataFrame按匹配键排序)
df2_sorted = df2.sort_values('start_range')

# 按id和start_range进行反向近似匹配(找到不大于当前id的最大start_range)
merged_df = pd.merge_asof(
    df1.sort_values('id'), 
    df2_sorted, 
    left_on='id', 
    right_on='start_range', 
    direction='backward'
)

# 过滤掉id超出对应end_range的情况(示例数据无此情况,实际场景可保留)
merged_df = merged_df[merged_df['id'] <= merged_df['end_range']]

# 恢复原DataFrame的顺序并整理列
result = merged_df.sort_index()[['value', 'id', 'entity']]

# 查看结果
print(result)

这种方法避免了逐行遍历,性能更优,适合处理十万级以上的大数据量。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:40:44