【问题标题】:Select most recent example of multiindex dataframe选择多索引数据框的最新示例
【发布时间】:2021-09-08 22:12:18
【问题描述】:

我有一个与Getting the last element of a level in a multiindex 类似的问题。在提到的问题中,多索引数据框为每个组都有一个始终相同的起始编号。

但是,我的问题略有不同。我又有两列。一列带有整数(在 MWE 下面是布尔值),第二列带有日期时间索引。与上面的示例类似,我想为第一列中的每个唯一值选择最后一行。在我的示例中,它表示具有最新时间戳的值。上述问题的解决方案不起作用,因为我没有第二列的固定起始值。

MWE:

import pandas as pd

df = pd.DataFrame(range(10), index=pd.date_range(pd.Timestamp("2020.01.01"), pd.Timestamp("2020.01.01") + pd.Timedelta(hours=50), 10))
mask = (df.index.hour > 1) & (df.index.hour < 9)
df.groupby(mask)
df = df.groupby(mask).rolling("4h").mean()

生成的数据框如下所示:

                             0
False 2020-01-01 00:00:00  0.0
      2020-01-01 11:06:40  2.0
      2020-01-01 16:40:00  3.0
      2020-01-01 22:13:20  4.0
      2020-01-02 09:20:00  6.0
      2020-01-02 14:53:20  7.0
      2020-01-02 20:26:40  8.0
True  2020-01-01 05:33:20  1.0
      2020-01-02 03:46:40  5.0
      2020-01-03 02:00:00  9.0

现在,我想为第一列中的每个值获取具有最新时间戳的行。即,我想获得以下数据框:

                             0
False 2020-01-02 20:26:40  8.0
True  2020-01-03 02:00:00  9.0

我非常感谢上述链接中的想法。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    假设级别 1 中的值已排序尝试使用groupby tail

    out = df.groupby(level=0).tail(1)
    

    out:

                                 0
    False 2020-01-02 20:26:40  8.0
    True  2020-01-03 02:00:00  9.0
    

    如果不是sort_index先:

    out = df.sort_index(level=1).groupby(level=0).tail(1)
    

    out:

                                 0
    False 2020-01-02 20:26:40  8.0
    True  2020-01-03 02:00:00  9.0
    

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 2017-04-01
      • 2020-08-18
      • 2020-04-16
      • 2017-03-12
      • 1970-01-01
      • 2020-04-27
      • 2019-02-10
      相关资源
      最近更新 更多