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
相关产品推荐
相关产品推荐

