代码之家  ›  专栏  ›  技术社区  ›  Anna Iliukovich-Strakovskaia

如何查找数据帧窗口max的源索引?

  •  2
  • Anna Iliukovich-Strakovskaia  · 技术社区  · 7 年前

    我有一个数据框架 DatetimeIndex 我想找到每个窗口的最大元素。但我也必须知道元素的索引。 实例数据:

    data = pd.DataFrame(
        index=pd.date_range(start=pd.to_datetime('2010-10-10 12:00:00'),
                            periods=10, freq='H'),
        data={'value': [3, 2, 1, 0, 5, 1, 1, 1, 1, 1]}
    )
    

    如果我使用最大值滚动,我会松开索引:

    data.rolling(3).max()
    

    出:

                         value
    2010-10-10 12:00:00    NaN
    2010-10-10 13:00:00    NaN
    2010-10-10 14:00:00    3.0
    2010-10-10 15:00:00    2.0
    2010-10-10 16:00:00    5.0
    2010-10-10 17:00:00    5.0
    2010-10-10 18:00:00    5.0
    2010-10-10 19:00:00    1.0
    2010-10-10 20:00:00    1.0
    2010-10-10 21:00:00    1.0
    

    如果我尝试使用argmax,我会在每个窗口中获取作为整数索引的索引(但是我必须找到源日期时间索引,或者只找到源数据帧的整数索引,以便能够使用 iloc ):

    data.rolling(3).apply(lambda x: x.argmax())
    

    出:

                         value
    2010-10-10 12:00:00    NaN
    2010-10-10 13:00:00    NaN
    2010-10-10 14:00:00    0.0
    2010-10-10 15:00:00    0.0
    2010-10-10 16:00:00    2.0
    2010-10-10 17:00:00    1.0
    2010-10-10 18:00:00    0.0
    2010-10-10 19:00:00    0.0
    2010-10-10 20:00:00    0.0
    2010-10-10 21:00:00    0.0
    

    有人能帮我在熊猫中找到这个的好功能/参数吗?

    我当然可以用 for 像:

    pd.DataFrame([{'value_max': data[ind: ind + window][target_var].max(),
                   'source_index': data[ind: ind + window].index[data[ind: ind + window][target_var].values.argmax()]
                  } for ind in range(1, len(data) + 1 - window)],
                 index=data.index[1:-window+1])
    

    它起作用了。但我想试着用熊猫找到更优雅的解决方案。

    期望输出:

                               source_index  value_max
    2010-10-10 13:00:00 2010-10-10 13:00:00          2
    2010-10-10 14:00:00 2010-10-10 16:00:00          5
    2010-10-10 15:00:00 2010-10-10 16:00:00          5
    2010-10-10 16:00:00 2010-10-10 16:00:00          5
    2010-10-10 17:00:00 2010-10-10 17:00:00          1
    2010-10-10 18:00:00 2010-10-10 18:00:00          1
    2010-10-10 19:00:00 2010-10-10 19:00:00          1
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   jezrael    7 年前

    使用 Resampler.agg 使用自定义函数,因为 idxmax 没有为实现 resampler 然而:

    def idx(x):
        return x.index.values[np.argmax(x.values)]
    
    df = data['value'].rolling(3).agg(['max', idx])
    df['idx'] = pd.to_datetime(df['idx'])
    print (df)
                         max                 idx
    2010-10-10 12:00:00  NaN                 NaT
    2010-10-10 13:00:00  NaN                 NaT
    2010-10-10 14:00:00  3.0 2010-10-10 12:00:00
    2010-10-10 15:00:00  2.0 2010-10-10 13:00:00
    2010-10-10 16:00:00  5.0 2010-10-10 16:00:00
    2010-10-10 17:00:00  5.0 2010-10-10 16:00:00
    2010-10-10 18:00:00  5.0 2010-10-10 16:00:00
    2010-10-10 19:00:00  1.0 2010-10-10 17:00:00
    2010-10-10 20:00:00  1.0 2010-10-10 18:00:00
    2010-10-10 21:00:00  1.0 2010-10-10 19:00:00
    

    谢谢,@sandeep kadapa改进解决方案:

    def idx(x):
        return x.idxmax().to_datetime64()