【问题标题】:Select last row from each column of multi-index Pandas DataFrame based on time, when columns are unequal length当列不等长时,根据时间从多索引 Pandas DataFrame 的每一列中选择最后一行
【发布时间】:2020-05-16 22:07:21
【问题描述】:

我有以下 Pandas 多索引 DataFrame,其中顶级索引是组 ID,二级索引是 when,采用 ISO 8601 时间格式(此处显示没有时间):

                                     value      weight
                         when                     
5e33c4bb4265514aab106a1a 2011-05-12   1.34       0.79
                         2011-05-07   1.22       0.83
                         2011-05-03   2.94       0.25
                         2011-04-28   1.78       0.89
                         2011-04-22   1.35       0.92
...                                    ...        ...
5e33c514392b77d517961f06 2009-01-31  30.75       0.12
                         2009-01-24  30.50       0.21
                         2009-01-23  29.50       0.96
                         2009-01-10  28.50       0.98
                         2008-12-08  28.50       0.65

when 当前定义为index,但这不是必需的。

断言

  1. when 可能不是唯一的。
  2. 各组的列长度可能不相等
  3. 在组内whenvalueweight 将始终具有相同的长度(对于每个when,将始终有一个value 和一个weight

问题

使用参数index_time,如何检索:

  1. 每个组相对于index_time 的最近过去的valueweight 以及index_timewhen 之间的差异(以秒为单位)。
  2. index_time 可能是过去的某个时间,因此仅选择了 when index_time 的条目。
  3. 应该以某种方式对结果进行索引,以便可以推断出每个结果的组 ID

示例

从上面看,如果index_time2011-05-10,那么结果应该是:

                          value     weight      age                     
5e33c4bb4265514aab106a1a   1.22      0.83      259200
5e33c514392b77d517961f06  30.75      0.12    72576000

【问题讨论】:

    标签: pandas dataframe time-series multi-index


    【解决方案1】:

    问题中给出的原始DataFramedf

    import pandas as pd
    
    df.sort_index(inplace=True)
    result = df.loc[pd.IndexSlice[:, :when], :].groupby('id').tail(1)
    result['age'] =  when - result.index.get_level_values(level=1)
    

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多