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

基于DataFrame B的范围列填充DataFrame A列(非索引对比类问题)

嘿,我猜你是想把DataFrame A里的每个数字,对应到DataFrame B中定义的区间所属的动物标签对吧?这就给你一步步解决!

先看我们的示例数据

首先是创建两个示例DataFrame的代码:

import pandas as pd

# 定义DataFrame A
A = pd.DataFrame([[1], [1], [2], [2], [3], [4], [4], [5], [6], [6], [7], [8]], columns=['Number'])
# 定义DataFrame B
B = pd.DataFrame([[1, 3, 'CAT'], [4, 6, 'DOG'], [7, 7, 'COW']], columns=['start', 'end', 'animal'])

DataFrame A的输出:

Number
0       1
1       1
2       2
3       2
4       3
5       4
6       4
7       5
8       6
9       6
10      7
11      8

DataFrame B的输出:

start  end animal
0      1    3    CAT
1      4    6    DOG
2      7    7    COW
实现区间匹配的解决方案

这里用pd.cut()函数来高效完成区间匹配,代码如下:

# 提取B中的区间边界和对应的动物标签
bins = B['start'].tolist() + [B['end'].iloc[-1] + 1]  # 额外添加一个上限,覆盖像8这种超出最后区间的数值
labels = B['animal'].tolist()

# 给A新增animal列,匹配对应区间的动物
A['animal'] = pd.cut(
    A['Number'],
    bins=bins,
    labels=labels,
    include_lowest=True,  # 确保第一个区间包含start的最小值
    right=True  # 区间为左闭右开,比如[1,4)对应CAT,刚好覆盖1-3的数值
)

# 给超出所有区间的数值(比如示例里的8)设置一个默认标签,避免出现空值
A['animal'] = A['animal'].cat.add_categories(['UNKNOWN']).fillna('UNKNOWN')

# 查看最终结果
print(A)

最终输出结果:

Number    animal
0       1       CAT
1       1       CAT
2       2       CAT
3       2       CAT
4       3       CAT
5       4       DOG
6       4       DOG
7       5       DOG
8       6       DOG
9       6       DOG
10      7       COW
11      8  UNKNOWN
代码说明
  • bins的构造:把B的start值作为区间左边界,最后加上end+1作为最后一个区间的右边界,这样能覆盖所有可能的数值;
  • pd.cut()参数:include_lowest=True保证第一个区间包含最小的start值,right=True让区间是左闭右开,完美匹配B里的start到end范围;
  • 处理空值:给分类添加UNKNOWN标签,把超出区间的数值统一标记,避免数据缺失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:26