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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:54:20