【问题标题】:Fixing an Index Error for a dataframe修复数据帧的索引错误
【发布时间】:2018-09-14 09:54:52
【问题描述】:

我正在尝试构建一个决策树分类器,我有以下代码:

def dtree(data, attrs, target):

    data = data[:]
    vals = []

    for entry in data:
        entry_index = attrs.index(target)
        vals.append(entry[entry_index])

    major = majority(data, attrs, target)

    if not data or (len(attrs) - 1) <= 0:
        return major
    elif vals.count(vals[0]) == len(vals):
        return vals[0]
    else:
        pick = choose(data, attrs, target)
        tree = {pick:{}}

        for each in get_vals(data, attrs, pick):
            new_d = get_data(data, attrs, pick, each)
            newAttr = attrs[:]
            newAttr.remove(pick)
            subtree = dtree(new_d, newAttr, target)
            tree[pick][each] = subtree

    return tree

地点:

  • data 是我的训练数据 (33582 x 21)pandas 数据框,
  • attrs 是数据帧头的列表,
  • target 是目标属性的字符串名称。
  • vals 是一个列表

当我调用此方法时,出现以下错误:

File "dtree_classifier.py", line 176, in dtree
   vals.append(entry[entry_index])

IndexError: string index out of range

我不确定那条线是怎么引发错误的,我不知道我应该做些什么来诊断它。

这是一个数据示例:

【问题讨论】:

  • 你能给我们完整的定义attrsvals方法吗?还要给出数据示例,以便您的情况可以重现。
  • @GrigoriyMikhalkin 我有,它在第一个代码块下。我使它更容易阅读。还添加了一些数据的图像
  • 我知道了,attrs 是一个列表,那么entry_index = attrs(target) 是什么意思? python调用list数据结构的语法无效
  • 另外,你给我们dtree方法的完整定义了吗?因为错误日志中提到的vals.append(entry[entry_index]) 行不存在
  • @GrigoriyMikhalkin 我已经用其余的方法更新了它。作为记录,您无法找到的行存在于原始代码块中,它在 for 循环中

标签: python pandas anaconda spyder


【解决方案1】:

因此,您的代码的那部分发生了错误:

for entry in data:
    entry_index = attrs.index(target)
    vals.append(entry[entry_index])

我想,您在这里要做的是遍历 data DataFrame 的所有行,并从每一行中,将列 target 的值添加到列表 vals。问题正在发生,因为迭代数据返回列名(字符串),而不是行。因此,当您索引entry 字符串时,索引为target 列,您会得到IndexError

在 pandas 中,有更好的方法来列出列的所有值:

data[target].tolist()

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 2019-08-12
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多