【问题标题】:Why am I getting this TypeError when I try to slice my Pandas DataFrame?当我尝试对 Pandas DataFrame 进行切片时,为什么会出现此 TypeError?
【发布时间】:2020-09-21 00:20:20
【问题描述】:

我从一个金融 API 中提取了一些股票数据,并用它创建了一个 DataFrame。列是“日期”、“数据 1”、“数据 2”、“数据 3”。然后,我将该 DataFrame 转换为以“日期”列作为索引的 CSV:

df.to_csv('data.csv', index_label='date')

在第二个脚本中,我读取了该 CSV 文件并尝试在两个日期之间对生成的 DataFrame 进行切片:

df = pd.read_csv('data.csv', parse_dates=['date'] ,index_col='date')
df = df['2020-03-28':'2020-04-28']

当我尝试这样做时,我得到以下类型错误:

TypeError: cannot do slice indexing on <class 'pandas.core.indexes.numeric.Int64Index'> with these indexers [2020-03-28] of <class 'str'>

很明显,问题在于我正在尝试使用 str 来切片 datetime 对象。但这是令人困惑的部分!如果在第一步中,我将 DataFrame 保存到 csv 并且不要将“日期”设置为索引:

df.to_csv('data.csv')

在我的第二个脚本中,我不再收到 TypeError:

df = pd.read_csv('data.csv', parse_dates=['date'] ,index_col='date')
df = df['2020-03-28':'2020-04-28']

现在它工作得很好。唯一的问题是我要处理默认的 Pandas 索引列。

为什么我在 CSV 中将“日期”列设置为索引时会收到 TypeError...但是当我没有在 CSV 中设置任何索引时却没有收到 TypeError?

【问题讨论】:

    标签: python-3.x pandas dataframe typeerror slice


    【解决方案1】:

    似乎在您的 df 的“第一个”实例中,date 列是 普通列(不是索引)并且这个DataFrame有一个默认值 index - 连续整数(其名称不重要)。

    在这种情况下运行df.to_csv('data.csv', index_label='date') 导致输出文件包含:

    date,date,data1,data2,data3
    0,2020-03-27,10.5,12.3,13.2
    1,2020-03-28,10.6,12.9,14.7
    

    即:

    • index 列(整数)被赋予 date 名称,由您传入 index_label 参数,
    • df 中被命名为 date 的下一列是 also 给定日期名称。

    然后,如果您阅读它正在运行 df = pd.read_csv('data.csv', parse_dates=['date'], index_col='date'),然后:

    • 第一个 date 列(整数)已被读取为 date 并且 设置为索引,
    • 第二个 date 列(日期)已被读取为 date.1 并且 这是一个普通列。

    现在,当您运行 df['2020-03-28':'2020-04-28'] 时,您会尝试查找行 index 在给定的范围内。但是索引列是 Int64Index 类型(在你的安装中检查这个),因此只是提到的异常 被扔了。

    当您运行df.to_csv('data.csv') 时,情况会有所不同。 现在这个文件包含:

    ,date,data1,data2,data3
    0,2020-03-27,10.5,12.3,13.2
    1,2020-03-28,10.6,12.9,14.7
    

    即:

    • 第一列(在 df 中是索引)没有名称并且 int 价值观,
    • 名为 dateonly 列是第二列,包含 日期。

    现在当你阅读它时,结果是:

    • date(转换为 DatetimeIndex)是index
    • 原始索引列的名称为未命名:0,不足为奇, 因为在源文件中它没有名字。

    现在,当您运行 df['2020-03-28':'2020-04-28'] 时,一切正常。

    未来要学的东西: 运行df.to_csv('data.csv', index_label='date') 不会设置这个 列作为索引。它保存当前索引列 在给定名称下,没有任何检查是否有任何其他列 只是同名。

    结果是两列可以同名。

    【讨论】:

    • 非常感谢您的详细解释。那么,解决方案就是在我在第一个脚本中创建 csv 之前将日期设置为索引。当我这样做时,它工作得很好。
    猜你喜欢
    • 2013-01-03
    • 2021-10-14
    • 2021-06-27
    • 2020-10-18
    • 2020-10-29
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多