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

按索引范围填充DataFrame列

高效实现DataFrame按区间批量赋值的方法

不用iterrows()循环,用矢量化的pandas/numpy方法就能高效解决这个问题,下面提供两种实用方案:

方案一:结合numpy.digitize(性能最优)

利用numpy的digitize函数快速定位每个索引所属的区间,再映射到对应values:

import pandas as pd
import numpy as np

# 示例数据
df = pd.DataFrame({'OtherCol': range(100000)})
indexes = [20000, 50000, 80000]
values = ['A', 'B', 'C', 'D']  # values长度需比indexes多1,对应n+1个区间

# 获取DataFrame索引(如果是自定义数值索引,直接用df.index即可)
df_index = df.index
# 定位每个索引对应的区间位置
bin_indices = np.digitize(df_index, indexes)
# 批量赋值
df['Values'] = [values[i] for i in bin_indices]

digitize会返回每个索引值落在indexes分割出的区间序号,刚好对应values的下标,全程矢量化计算,速度比循环快几十倍。

方案二:用pd.cut(更直观)

pandas的cut函数专门用于分箱操作,适合需要明确区间边界的场景:

import pandas as pd
import numpy as np

# 示例数据
df = pd.DataFrame({'OtherCol': range(100000)})
indexes = [20000, 50000, 80000]
values = ['A', 'B', 'C', 'D']

# 构造完整区间:从0开始,到最后一个分割点后延伸至无穷大
bins = [0] + indexes + [np.inf]
# 分箱并赋值
df['Values'] = pd.cut(df.index, bins=bins, labels=values, include_lowest=True)

include_lowest=True确保第一个区间包含起始索引0,完美匹配你的赋值规则,代码可读性更强。

注意事项

  • 必须保证values的长度 = indexes长度 + 1,因为n个分割点会产生n+1个连续区间
  • 两种方案都支持非默认的数值型索引(只要索引是有序数值)
  • 矢量化操作的时间复杂度远低于循环,处理20MB级别的CSV文件完全无压力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:17:08