IndexError:在python中,即使范围存在,列表索引也超出范围

时间:2018-07-21 08:00:58

标签: python pandas numpy

我确定我要访问的范围存在,但是程序仍然显示错误。我正在尝试制作一个程序,该程序将汇总与另一列中的值相对应的一列中的值。

例如:

   28400    4
   28400    34 
   28400    9
   65478    2
   65478    5
   65478    3

我的程序将要做的是,它将相加4,34和9,然后将相加2,5和3,然后是输出-

   47
   47
   47
   10
   10
   10  

我正在从CSV文件导入数据。以下是代码-

    import pandas as pd
    import numpy as np

    assessment = pd.read_csv('/home/user/Documents/MOOC dataset original/studentVle2.csv')


    assessment = assessment.values

    count=0
    stucount=28400
    sumc=[]
    i=0
    for stu in assessment[:,2:3]:
        if(stucount==stu):
            count = count + assessment[i,5]
            i=i+1
        else:
            sumc.append(count)
            count = 0
            count = count + assessment[i,5]
            i=i+1
        stucount=stu

    #print(sumc)

    stucount=28400
    i=0
    a=[]
    for stu in assessment[:,2:3]:
        if(stucount==stu):
            a.append(sumc[i])
            stucount = stu
        else:
            i=i+1
            a.append(sumc[i])
            stucount = stu

    print(a)

错误:

        File "/home/user/Documents/final project files/test.py", line 36, in <module>
        a.append(sumc[i])
        IndexError: list index out of range

顺便说一句,在添加一些行(如i = i + 1,stucount = stu)之前,没有显示此错误,但现在显示的是即使发生的情况相同。

4 个答案:

答案 0 :(得分:4)

该错误是因为循环结束后,您没有将最后一个学生的评估值添加到sumc列表中。因此,对于n个唯一的学生ID,列表长度仅为n-1。在for循环之后,添加sumc.append(count)。见下文。

assessment = assessment.values

count=0
stucount=28400
sumc=[]
i=0
for stu in assessment[:,2:3]:
    if(stucount==stu):
        count = count + assessment[i,5]
        i=i+1
    else:
        sumc.append(count)
        count = 0
        count = count + assessment[i,5]
        i=i+1
    stucount=stu

sumc.append(count)
print(sumc)

stucount=28400
i=0
a=[]
for stu in assessment[:,2:3]:
    if(stucount==stu):
        a.append(sumc[i])
        stucount = stu
    else:
        a.append(sumc[i])
        stucount = stu
        i=i+1

print(a)

答案 1 :(得分:3)

i=i+1放在stucount = stu下方,然后尝试

import pandas as pd
import numpy as np

assessment = pd.read_csv('/home/user/Documents/MOOC dataset original/studentVle2.csv')


assessment = assessment.values

count=0
stucount=28400
sumc=[]
i=0
for stu in assessment[:,2:3]:
    if(stucount==stu):
        count = count + assessment[i,5]
        i=i+1
    else:
        sumc.append(count)
        count = 0
        count = count + assessment[i,5]
        i=i+1
    stucount=stu

#print(sumc)

stucount=28400
i=0
a=[]
for stu in assessment[:,2:3]:
    if(stucount==stu):
        a.append(sumc[i])
        stucount = stu
    else:
        a.append(sumc[i])
        stucount = stu
        i=i+1

print(a)

输出将有所不同,并相应地进行更改。...错误将被消除

答案 2 :(得分:3)

在这里,我只是按照您的初步问题陈述来说明您拥有的东西和想要得到的东西。

df = pd.DataFrame([[28400,4],
                   [28400,34],
                   [28400,9],
                   [65478,2],
                   [65478,5],
                   [65478,3]], columns=list('AB'))
sums = df.groupby('A').B.sum()
df.A.map(sums)

然后你得到

0    47
1    47
2    47
3    10
4    10
5    10
Name: A, dtype: int64

这是您要找的吗?

答案 3 :(得分:2)

我认为您应该在错误行i=i+1之后添加a.append(sumc[i])。 因为在您的代码中,可能最终超出列表范围。