【问题标题】:Why does having a list inside of a list give me list indices error?为什么在列表中有一个列表会给我列表索引错误?
【发布时间】:2021-12-05 09:08:08
【问题描述】:

嘿,我是数据结构的新手,想在 Pandas 中尝试二维数组,但在以下代码中出现错误

import pandas as pd
from datetime import datetime as dt

ls = [[dt(2021, 9, 4).strftime("%d-%m-%Y"), "WTM", 62, 100, 64, 100, 86, 100, 212, 300], [dt(2021, 9, 5).strftime("%d-%m-%Y"), "WTA", 48, 60, 39, 60, 31, 60, 118, 180]
    [dt(2021, 10, 23).strftime("%d-%m-%Y"), "WTM", 7, 100, 27, 100, 47, 100, 81, 300]]

data = pd.DataFrame(ls, columns=['Exam Date', 'Exam Type', 'Maths', 'Max Marks', 'Chemistry', 'Max Marks', 'Physics', 'Max Marks', 'Total', 'Max Marks'])

我复活的错误是

TypeError: list indices must be integers or slices, not tuple

那么我做错了什么 谢谢

【问题讨论】:

  • 列表中的第二个和第三个元素之间缺少一个逗号。
  • 对未来的重要说明:这里的TypeError 是在ls = ... 行上生成的,而不是在data = ... 行上生成的。这个很重要。错误消息尽量具有描述性,以帮助您找到代码中的错误。错误消息告诉您的第一件事通常是在哪一行遇到错误。不要忽略这些信息。

标签: python pandas dataframe data-structures


【解决方案1】:

您在第二个数组之后错过了,

【讨论】:

    【解决方案2】:

    让我们从dtPandas 中的日期时间访问器这样一个细节开始。 因此,当您使用其他名称时,它会“更干净”,例如:

    from datetime import datetime as dtm
    

    那么对您的源数据的唯一更改是我在后面添加了一个逗号 第二行:

    ls = [
        [dtm(2021,  9,  4).strftime("%d-%m-%Y"), "WTM", 62, 100, 64, 100, 86, 100, 212, 300],
        [dtm(2021,  9,  5).strftime("%d-%m-%Y"), "WTA", 48,  60, 39,  60, 31,  60, 118, 180],
        [dtm(2021, 10, 23).strftime("%d-%m-%Y"), "WTM",  7, 100, 27, 100, 47, 100,  81, 300]]
    

    然后我使用了你的代码并得到了正确的结果。

    还有一点是你不应该使用重复的列名。

    否则,在您像以前一样命名列之后, 当我运行 data[['Max Marks']] 时,我得到 all 4 Max Marks 列。

    还有一个提示是使用 pandasonic Timestamp 类型,而不是 datetime。 您可以将源数据定义为:

    ls = [
        [pd.Timestamp(2021,  9,  4), "WTM", 62, 100, 64, 100, 86, 100, 212, 300],
        [pd.Timestamp(2021,  9,  5), "WTA", 48,  60, 39,  60, 31,  60, 118, 180],
        [pd.Timestamp(2021, 10, 23), "WTM",  7, 100, 27, 100, 47, 100,  81, 300]]
    

    然后 DataFrame 的打印输出看起来是一样的(Exam Dateyyyy-mm-dd 格式打印)。 真正的收获是您可以使用日期方法来选择和/或 源数据的分组。

    考虑在列上也使用 MultiIndex,将 DataFrame 创建为:

    data = pd.DataFrame(ls, columns=pd.MultiIndex.from_tuples([
        ('Exam Date', ''),       ('Exam Type', ''),
        ('Maths',     'Result'), ('Maths',     'Max'),
        ('Chemistry', 'Result'), ('Chemistry', 'Max'),
        ('Physics',   'Result'), ('Physics',   'Max'),
        ('Total',     'Result'), ('Total',     'Max')]))
    

    然后 DataFrame 具有“结构”列名。第一级是 主题名称和第二个 - actualMax 结果:

       Exam Date Exam Type  Maths      Chemistry      Physics       Total     
                           Result  Max    Result  Max  Result  Max Result  Max
    0 2021-09-04       WTM     62  100        64  100      86  100    212  300
    1 2021-09-05       WTA     48   60        39   60      31   60    118  180
    2 2021-10-23       WTM      7  100        27  100      47  100     81  300
    

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2020-10-11
      • 2017-12-02
      相关资源
      最近更新 更多