【问题标题】:while-loop: list index out of range filtering dataframewhile-loop:列表索引超出范围过滤数据帧
【发布时间】:2021-07-21 15:16:58
【问题描述】:

基本上我有一个完整的数字标识符列表——我使用这些数字标识符作为过滤数据帧的条件,然后一旦过滤掉 df,我就会尝试将过滤后的数据帧的长度存储为值在一个新的、单独的数据框中。

我使用我的数字标识符列表中的最后一个值(例如list[-1])作为我循环的停止点——我这样做是为了让循环通过所有标识符运行并在它通过最后一个——我认为这可能是问题所在。

我的代码在遍历列表中的所有唯一数字标识符时吐出所有正确的长度 - 但是,它仍然给我一个索引超出范围错误(如下所示)。

def get_frames(U_id):
    k = sorted(df.trackId.unique())
    #k is the sorted list of unique numerical identifiers
   i = 0
   maximum = k[-1]  #am using the final value in the list as the stopping point for the loop

    while i <= maximum:
        condition = df.trackId == k[i]
        df2 = df[condition]
        values = print(len(df2))
        df2 = pd.DataFrame({U_id:values}, index = [i])
        i+=1
return df2

get_frames('1CCM0701')
 36
 18
 37
 4
 33
 25
 27
 49
 46
 12
 45
 24
 4
 ---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-120-3252dfb603ae> in <module>
13     return df2
14
 ---> 15 get_frames('1CCM0701')

 <ipython-input-120-3252dfb603ae> in get_frames(U_id)
 6     maximum = k[-1]
 7     while i <= maximum:
  ----> 8         condition = df.trackId == k[i]
 9         df2 = df[condition]
10         values = print(len(df2))

IndexError: list index out of range

【问题讨论】:

    标签: python dataframe loops indexing while-loop


    【解决方案1】:

    这里的问题是,当您使用通过索引访问数组的迭代变量时,您使用 k[-1] 作为停止点。 k[-1] 是36,这显然与你的数组长度无关。相反,您应该使用 for 循环,或者将 i 与数组的长度进行比较。

    Pythonic For 循环:

    for i, val in enumerate(k):
        condition = df.trackId == val
        df2 = df[condition]
        values = print(len(df2))
        df2 = pd.DataFrame({U_id:values}, index = [i])
    

    传统的 For 循环

    for i in range(len(k))
        condition = df.trackId == k[i]
        df2 = df[condition]
        values = print(len(df2))
        df2 = pd.DataFrame({U_id:values}, index = [i])
    

    While 循环

    arrLen = len(k)
    while i < arrLen:
        condition = df.trackId == k[i]
        df2 = df[condition]
        values = print(len(df2))
        df2 = pd.DataFrame({U_id:values}, index = [i])
        i+=1
    

    【讨论】:

    • while循环的条件不应该是i &lt; arrLen吗?否则,当i 等于arrLen 时,您将再次获得IndexError: list index out of range
    • @yeeshue99 非常棒,完美运行。非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2011-06-14
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多