Pandas执行df.apply时触发IndexError: index -1越界错误
问题描述
尝试对Pandas DataFrame逐行应用自定义函数,将返回结果赋值为新列。实际使用的DataFrame形状为(1791, 263),索引为RangeIndex(start=0, stop=1791, step=1)。
在DataFrame上调用.apply方法执行逐行计算时触发报错,最小复现代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [0, 1, 2, 3, 4], 'vals': [[1,3,4,6,3],[3,5,6,2,6],[9,5,6,2,5],[3,5,6,7,3],[3,6,4,7]] }) df['val_rand'] = df.apply(lambda row : np.quantile(random.sample(row['vals'],int(len(row['vals'])/2)),[0.25,0.75]), axis = 1)
报错回溯核心信息:
IndexError: index -1 is out of bounds for axis 0 with size 0
错误原因
报错核心触发逻辑是传入np.quantile的待计算数组为空,具体链路:
- 代码中采样数量的计算逻辑为
int(len(row['vals'])/2),当vals列存储的列表长度为0或1时,计算得到的采样数为0。 random.sample(列表, 0)会返回空列表,将空列表传入np.quantile计算分位数时,numpy内部插值逻辑需要访问数组元素,空数组长度为0,访问ap[-1]时直接触发索引越界。- 额外小问题:复现代码中缺失
import random语句,直接运行会先触发NameError。
修复方案
- 修正采样数量计算逻辑,保证采样数至少为1,从根源避免空数组传入分位数计算函数
- 补全缺失的
random模块导入 - (可选优化)如果需要将两个分位数值单独存为两列,可以通过
result_type='expand'参数自动拆分返回的数组
修复后可运行代码:
import pandas as pd import numpy as np import random # 补全缺失的导入 df = pd.DataFrame({ 'id': [0, 1, 2, 3, 4], 'vals': [[1,3,4,6,3],[3,5,6,2,6],[9,5,6,2,5],[3,5,6,7,3],[3,6,4,7], [1]] # 加入长度为1的测试用例验证逻辑 }) # 采样数取max(1, 半长),避免采样0个元素;加result_type='expand'可直接拆为两列 df[['q25_rand', 'q75_rand']] = df.apply( lambda row : np.quantile( random.sample(row['vals'], max(1, int(len(row['vals'])/2))), # 核心修复:采样数最小为1 [0.25,0.75] ), axis = 1, result_type='expand' )
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

