【问题标题】:TypeError: '(slice(None, 59, None), slice(None, None, None))' is an invalid keyTypeError: '(slice(None, 59, None), slice(None, None, None))' 是一个无效的键
【发布时间】:2020-11-19 23:08:38
【问题描述】:

我有下表,我想删除这些带有 NaN 值的行。

                   date    Open  ...  Real Lower Band  Real Upper Band
0   2020-07-08 08:05:00  2.1200  ...              NaN              NaN
1   2020-07-08 09:00:00  2.1400  ...              NaN              NaN
2   2020-07-08 09:30:00  2.1800  ...              NaN              NaN
3   2020-07-08 09:35:00  2.2000  ...              NaN              NaN
4   2020-07-08 09:40:00  2.1710  ...              NaN              NaN
5   2020-07-08 09:45:00  2.1550  ...              NaN              NaN

这些NaN 值是直到行号。 58

为此,我编写了以下代码。但是出现了上述错误。

data.drop(data[:59,:],inplace= True)
print(data)

请帮帮我!

【问题讨论】:

  • 而那些 NaN 在最后 3 列中。
  • drop 是按索引而不是数据,你也可以使用 dropna 和阈值

标签: python-3.x pandas dataframe nan algorithmic-trading


【解决方案1】:

您希望从 59 次 开始保留行,因此您可以运行的最短代码是:

data = data[59:]

【讨论】:

    【解决方案2】:

    有很多选项可供选择:

    1. 按索引标签删除行。

      df.drop(list(range(59)),axis=0,inplace=True)

    2. 如果 nans 在选定的列中,则删除。

      df.dropna(axis=0, subset=['Real Upper Band'], inplace=True)

    3. 通过索引标签切片选择要保留的行

      df = df.loc[59:, :] # 59是索引中的标签,如果索引是日期则将59替换为对应的日期时间

    4. 通过整数索引切片选择要保留的行(类似于对列表进行切片)

      df = df.iloc[59:, :] # 59是0-index行号,不管df上设置了什么索引

    5. 使用 .loc 和 .isna() 返回的布尔数组进行过滤

      df = df.loc[~df['Real Upper Band'].isna(), :]

    记住 loc 和 iloc 在应用于数据帧时使用二维,建议使用完整切片 : 以避免歧义并根据文档 https://pandas.pydata.org/docs/user_guide/indexing.html 提高性能

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2019-08-12
      • 2023-03-30
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多