按索引范围填充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
相关产品推荐
相关产品推荐

