基于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
相关产品推荐
相关产品推荐

