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

如何基于DataFrame B的区间规则批量设置DataFrame A的speed列值?

按区间为DataFrame列赋值的最优实现

问题说明

现有两个Pandas DataFrame:

  • DataFrame A(共80行)的初始化代码:
import pandas as pd
info2 = {'speed': [None]*80}
dfA = pd.DataFrame(info2)
  • DataFrame B的初始化代码:
info={"IndexSpeed":[7,16,44,56,80],"speed":[25,50,25,50,90]}
dfB = pd.DataFrame(info)

需要根据dfB的IndexSpeed划分区间,给dfA的speed列赋值:

  • 索引≤7的行 → speed=25
  • 索引8~16的行 → speed=50
  • 索引17~44的行 → speed=25
  • 索引45~56的行 → speed=50
  • 索引57~79的行 → speed=90

最优实现方案

方案1:用pd.cut快速映射(代码简洁)

这是最直观的写法,直接把索引按dfB的分界值切成区间,再绑定对应speed:

# 构建区间边界:左起点0,右边界用dfB的IndexSpeed值
bins = [0] + dfB['IndexSpeed'].tolist()
# 每个区间对应的speed值
labels = dfB['speed'].tolist()
# 给dfA的speed列赋值
dfA['speed'] = pd.cut(dfA.index, bins=bins, labels=labels, include_lowest=True)

include_lowest=True的作用是让第一个区间包含最左的0,刚好覆盖所有索引≤7的行。

方案2:用pd.merge_asof(大数据场景更高效)

如果处理的是超大规模数据,merge_asof的性能会更出色,它会按索引匹配最近的分界值:

# 给dfA加一列存索引,方便后续匹配
dfA['index_col'] = dfA.index
# merge_asof要求右表必须按匹配列排序,先把dfB按IndexSpeed排序
dfB_sorted = dfB.sort_values('IndexSpeed')
# 按索引匹配最近的分界值
merged_df = pd.merge_asof(dfA, dfB_sorted, left_on='index_col', right_on='IndexSpeed', direction='backward')
# 把匹配到的speed赋值给dfA
dfA['speed'] = merged_df['speed']
# 删掉临时加的索引列
dfA.drop('index_col', axis=1, inplace=True)

direction='backward'表示为每个索引找不大于它的最大IndexSpeed,自动完成区间匹配,不用手动定义区间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:31:14