pandas for循环索引0超出大小为0的轴0的界限

zqry0prt  于 2023-09-29  发布在  其他
关注(0)|答案(2)|浏览(112)

我在做一个出勤记录脚本。
目标是构建一些功能,其中脚本循环遍历电子表格A,当它到达“attendees”列中的列表值时,它需要循环遍历该列表,并找到当前字符串值等于电子表格B中另一个字符串值的位置。然后,它需要将“Present”放在stings行中,其中也有相应的“session”列。
我遇到的问题是,我得到这个错误与我目前的算法。

index 0 is out of bounds for axis 0 with size 0

这是我的代码

import openpyxl
from openpyxl import workbook, load_workbook
import pandas as pd
import numpy as np

#code that I may use later
#sheet.drop_duplicates(subset = [ 'Date', 'Name'], keep= 'last', inplace= True)

wb = pd.ExcelFile(r"C:\Users\A0851982\OneDrive - Aon\Documents\Work\Projects\\2023\Account managment institute\\attendance checker.xlsx")
sheet = pd.read_excel(wb, 'sheet')
atndOvr = pd.read_excel(wb, 'Attendance overview')

#This fucntion will change the attending column from a string to a list
def createList(index):
    cell = sheet.at[sheet.index[index],'attending']
    cellList = list(cell.split(";"))
    return cellList

#looping methodology(where the supected problem is occuring)
for ind in sheet.index:
    print(ind, sheet['Session'][ind], createList(ind))
    attendees = createList(ind)
    for name in attendees:
        #print(name)
        if name == '':
            pass
        else:
            #I'm getting the error in the index string
            index = atndOvr.loc[atndOvr['Names'] == name].index[0]
            print(index)
            atndOvr.at[index, sheet['Session'][ind]] = 'present'
            print(atndOvr)
        
print(atndOvr)

下面是 Dataframe 的快照

我一直在尝试在pandas中组合使用.loc和.at方法来定位要添加数据的特定单元格。我使用.loc来获取电子表格B中单元格的索引,其中它等于我正在循环的列表中的名称。然后我使用.at来实际更改数据。
我希望它抓取索引(它确实抓取了),它只需要会话(它确实抓取了),然后在单元格中标记为present。不幸的是,它在单元格索引27处停止,并给出索引0超出大小为0的轴0的范围,并突出显示此变量-

index = atndOvr.loc[atndOvr['Names'] == name].index[0]

我还尝试在字符串中输入一个打印电子表格B动作,它打印电子表格,但它再次停止向单元格和索引27添加当前值。
这是最终结果“名字不是真实的的”。
27客户服务标准概述和资源N ['Kathy',''] 46名称客户服务标准概述和资源导航... TSA客户服务标准概述和资源N 0格伦NaN. NaN存在
1 Lovelace NaN.楠楠
2托马斯NaN.楠楠
3 Kelly NaN.楠楠
4 Stephanie NaN. NaN存在
5 James NaN. NaN存在
6 Mariah NaN.楠楠
7 Sarah NaN. NaN存在
8 Liam NaN. NaN存在
9 Karlin NaN. NaN存在
10 Keila NaN.楠楠
11布鲁克NaN. NaN存在
12 Timothy NaN. NaN存在
13 Edna NaN. NaN存在
14 Bailey NaN. NaN存在
15 Cat NaN.楠楠
16 Emma NaN. NaN存在
17 Dylan NaN. NaN存在
18马迪纳NaN.楠楠
19 Angela NaN.楠楠
20凯尔NaN.楠楠
21 Tim NaN... NaN存在
22 Michael NaN.楠楠
23 DeWitt NaN.楠楠
24 Ben NaN. NaN存在
25 Darren NaN.楠楠
26阿什利NaN.楠楠
27 Wendy NaN.楠楠
28 Dan NaN... NaN存在
29 Charlie NaN. NaN存在
30白色NaN.楠楠
31 Kelli NaN. NaN存在
32卡梅隆NaN. NaN存在
33 Jovanovic NaN.楠楠
34豪瑟NaN. NaN存在
35 Christopher NaN. NaN存在
36 Donner NaN. NaN存在
37 Valerie NaN.楠楠

3htmauhk

3htmauhk1#

没有实际的数据是不可能确定的,但错误本质上是说atndOvr.loc[atndOvr['Names'] == name]返回一个空结果(意思是没有匹配的名称)。现在你必须弄清楚为什么会这样(这需要拥有和理解数据)。

gj3fmq9x

gj3fmq9x2#

基于我对你的I/O的想象,你可以这样修复/简化你的代码:

wb_path = r"C:\Users\A0851982\OneDrive - Aon\Documents\Work\Projects" \
          r"\2023\Account managment institute\attendance checker.xlsx"
    
use_sheets = ["sheet", "Attendance overview"]

sheet, atndOvr = pd.read_excel(wb_path, sheet_name=use_sheets).values()

atndOvr["Session"] = [
    "present" if any(n in l for l in sheet["attending"].str.split(";\s*"))
    else None for n in atndOvr["Names"] # change None if needed
]
  • 更新 在提供截图/评论后 *):

基于意见/更新问题中提供的OP的新细节/要求:

dmap = {0: "Absent", 1: "Present"}
sessions = atndOvr.set_index("Names").columns

checks = pd.DataFrame([
    [dmap[n in list(map(str.lower, l))]
     for l, s in zip(sheet["Attending"].str.split(";\s*"), sheet["Session"])]
    for n in atndOvr["Names"].str.lower()], columns=sessions
)

atndOvr.update(checks)

输出量:

print(atndOvr)

  Names        A        B        C
0   foo  Present   Absent   Absent
1   BAZ   Absent   Absent  Present
2   qux   Absent  Present   Absent
3   XXX   Absent   Absent   Absent

使用的电子表格:

相关问题