【问题标题】:Pandas .asfreq is giving a repeated index errorPandas .asfreq 给出重复的索引错误
【发布时间】:2016-06-08 23:56:29
【问题描述】:

我正在尝试使用 Pandas 使用 ffill 制作一些常规时间序列,但出现非唯一索引错误。

这是我的代码:

for d in data_types:
    series = df[df['datatype'] == d]['measurementvalue'].values
    times = df[df['datatype'] == d]['displaydate'].values
    data_series = pd.Series(series, index = times)
    data_series.drop_duplicates(inplace = True)
    data_series.asfreq('30Min', method = 'ffill')
    all_series.append(data_series)

由于asfreq 调用一个特定的data_type,我收到以下错误:

ValueError: cannot reindex a non-unique index with a method or limit

这是一组数据,其中drop_duplicates 导致长度从 2119 下降到 1299,表明它是最密集(时间方面)的值。

===========

编辑

我做了一些探索,并通过将时间滞后到索引中最接近的秒来缩小问题的范围,我可以看到当两行落在同一秒时创建的“重复”索引。我的猜测是这些是有问题的行...

2016-03-02 04:03:29.693    8.250347
2016-03-02 04:03:29.693    7.478983
2016-03-06 00:19:30.183    45.97248
2016-03-06 00:19:30.183    24.06088
2016-03-14 02:44:58.783    9.169300
2016-03-14 02:44:58.783    4.221998
2016-03-18 21:54:20.097    73.80586
2016-03-24 16:41:19.825    3.608202
2016-03-24 16:41:19.825    3.887996
2016-03-25 03:35:57.197    4.974968
2016-03-25 03:35:57.197    5.638140
2016-04-02 11:18:27.290    7.923712
2016-04-02 11:18:27.290    6.143240
2016-04-10 19:59:54.677     3.143636
2016-04-10 19:59:54.686    14.222390

删除值的最佳方法是什么?假设我想编写一个自定义方法,将给定索引值的所有重复值发送给我,并发送回应该用于该索引值的单个值。我该怎么做?

【问题讨论】:

标签: python pandas


【解决方案1】:

尝试这样的事情,但是由于您没有包含任何数据,这只是一个开始。

for d in data_types:
        rawDf       = df[df['datatype'] == d]
        data_series = rawDf[['measurementvalue','displaydate']]
        data_series.set_index('displaydate',drop=False, inplace = True)
        data_series.drop_duplicates(inplace = True)
        data_series.asfreq('30Min', method = 'ffill')
        all_series.append(data_series)

【讨论】:

  • 感谢您的建议,但这仍然会产生错误。我想我现在知道错误的根源,尽管我不知道修复方法。我现在正在编辑我的问题,以包含有关数据的更多信息。
  • 正确,那么如何编写删除值的逻辑以及如果我想组合它们的值呢?
  • 假设我想保持最大值。
  • df.groupby('displaydate')['measurementvalue'].max()
【解决方案2】:

如果您想保持每个日期时间的最大值。首先将 date_time 设为一列并使用

df.groupby('date_time').max()

如果您想始终保留第一个或最后一个条目,look at this answer:

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多