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

