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

Pandas报错index 0 is out of bounds:考勤追踪脚本问题排查

问题分析

你遇到的index 0 is out of bounds for axis 0 with size 0错误,本质是当遍历到某个姓名时,在atndOvr的Names列中找不到匹配项,导致atndOvr.loc[atndOvr['Names'] == name]返回空的DataFrame,此时强行访问.index[0]就会触发索引越界。

常见触发场景:

  • 拆分后的姓名带前后空格(比如字符串是"Glenn ; Madina",拆分后得到["Glenn ", " Madina"])
  • 姓名大小写不一致(比如"glenn" vs "Glenn")
  • sheet中的姓名确实不在atndOvr的名单里
解决方案

1. 先清理姓名格式

在拆分字符串后,给每个姓名去除前后空格,同时过滤空字符串,避免无效匹配:

def createList(index):
    cell = sheet.at[sheet.index[index],'attending']
    cellList = [name.strip() for name in cell.split(";") if name.strip()]
    return cellList

2. 增加匹配判断,避免空结果报错

在获取索引前,先检查是否找到匹配项,找不到时可以跳过或打印提示方便排查:

for ind in sheet.index:
    print(ind, sheet['Session'][ind], createList(ind))
    attendees = createList(ind)
    session_col = sheet['Session'][ind]
    for name in attendees:
        matched_rows = atndOvr.loc[atndOvr['Names'] == name]
        if not matched_rows.empty:
            index = matched_rows.index[0]
            atndOvr.at[index, session_col] = 'present'
            print(index)
            print(atndOvr)
        else:
            print(f"未找到姓名:{name},跳过")

3. 额外优化(解决大小写问题)

提前统一姓名的大小写格式,彻底避免因大小写差异导致的匹配失败:

# 预处理考勤表的姓名列:清理空格+转小写
atndOvr['Names'] = atndOvr['Names'].str.strip().str.lower()

# 拆分姓名时同步转小写
def createList(index):
    cell = sheet.at[sheet.index[index],'attending']
    cellList = [name.strip().lower() for name in cell.split(";") if name.strip()]
    return cellList
修改后的完整代码
import pandas as pd

wb = pd.ExcelFile(r"C:\Users\MyUser\Folder\attendance checker.xlsx")
sheet = pd.read_excel(wb, 'sheet')
atndOvr = pd.read_excel(wb, 'Attendance overview')

# 预处理:统一姓名格式
atndOvr['Names'] = atndOvr['Names'].str.strip().str.lower()

def createList(index):
    cell = sheet.at[sheet.index[index],'attending']
    cellList = [name.strip().lower() for name in cell.split(";") if name.strip()]
    return cellList

for ind in sheet.index:
    current_session = sheet['Session'][ind]
    attendees = createList(ind)
    print(ind, current_session, attendees)
    
    for name in attendees:
        matched_rows = atndOvr.loc[atndOvr['Names'] == name]
        if not matched_rows.empty:
            index = matched_rows.index[0]
            atndOvr.at[index, current_session] = 'present'
            print(f"标记姓名:{name},索引:{index}")
        else:
            print(f"警告:未找到姓名 {name},跳过")

# 可选:保存修改后的考勤表
# atndOvr.to_excel("更新后的考勤表.xlsx", index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:00:03