【问题标题】:Getting the Last and 3rd Last Records in a Dataframe Based on Criteria根据条件获取数据框中的最后一条和倒数第三条记录
【发布时间】:2022-12-09 17:33:16
【问题描述】:

我有一个大数据框(下面摘录),并希望根据每个 ID 的时间创建一个包含最后一个“进行中”行和倒数第三个“进行中”行的新数据框。

我是 Pandas 的新手,不知道该怎么做。任何帮助,将不胜感激。

数据框:

Time State ID Ref Name
10:00 In-progress 54887 1 Jim
10:00 In-progress 54887 2 Jon
10:00 In-progress 54887 3 Rob
10:00 In-progress 54887 4 Sam
11:00 In-progress 54887 1 Jim
11:00 In-progress 54887 2 Jon
11:00 In-progress 54887 3 Rob
11:00 In-progress 54887 4 Sam
12:00 In-progress 54887 1 Jim
12:00 In-progress 54887 2 Jon
12:00 In-progress 54887 3 Rob
12:00 In-progress 54887 4 Sam
13:00 Done 54887 1 Jim
13:00 Done 54887 2 Jon
13:00 Done 54887 3 Rob
13:00 Done 54887 4 Sam
10:00 In-progress 65228 a Anya
10:00 In-progress 65228 b Lot
10:00 In-progress 65228 c Ted
10:00 In-progress 65228 d Tom
11:00 In-progress 65228 a Anya
11:00 In-progress 65228 b Lot
11:00 In-progress 65228 c Ted
11:00 In-progress 65228 d Tom
12:00 In-progress 65228 a Anya
12:00 In-progress 65228 b Lot
12:00 In-progress 65228 c Ted
12:00 In-progress 65228 d Tom
13:00 Done 65228 a Anya
13:00 Done 65228 b Lot
13:00 Done 65228 c Ted
13:00 Done 65228 d Tom

期望的结果:

Time State ID Ref Name
10:00 In-progress 54887 1 Jim
10:00 In-progress 54887 2 Jon
10:00 In-progress 54887 3 Rob
10:00 In-progress 54887 4 Sam
12:00 In-progress 54887 1 Jim
12:00 In-progress 54887 2 Jon
12:00 In-progress 54887 3 Rob
12:00 In-progress 54887 4 Sam
10:00 In-progress 65228 a Anya
10:00 In-progress 65228 b Lot
10:00 In-progress 65228 c Ted
10:00 In-progress 65228 d Tom
12:00 In-progress 65228 a Anya
12:00 In-progress 65228 b Lot
12:00 In-progress 65228 c Ted
12:00 In-progress 65228 d Tom

【问题讨论】:

  • 你想要最后一个吗倒数第三个(即不是倒数第二个)或最后一个倒数第三?

标签: python pandas


【解决方案1】:

倒数第三个

使用groupby.tail

out = (df[df['State'].eq('In-progress')]
       .groupby(['Time', 'ID']).tail(3)
      )

输出:

     Time        State     ID Ref Name
1   10:00  In-progress  54887   2  Jon
2   10:00  In-progress  54887   3  Rob
3   10:00  In-progress  54887   4  Sam
5   11:00  In-progress  54887   2  Jon
6   11:00  In-progress  54887   3  Rob
7   11:00  In-progress  54887   4  Sam
9   12:00  In-progress  54887   2  Jon
10  12:00  In-progress  54887   3  Rob
11  12:00  In-progress  54887   4  Sam
17  10:00  In-progress  65228   b  Lot
18  10:00  In-progress  65228   c  Ted
19  10:00  In-progress  65228   d  Tom
21  11:00  In-progress  65228   b  Lot
22  11:00  In-progress  65228   c  Ted
23  11:00  In-progress  65228   d  Tom
25  12:00  In-progress  65228   b  Lot
26  12:00  In-progress  65228   c  Ted
27  12:00  In-progress  65228   d  Tom

最后和倒数第三(不包括倒数第二)

使用groupby.cumcount

idx = (df[df['State'].eq('In-progress')]
       .groupby(['Time', 'ID']).cumcount(ascending=False)
       .isin([0,2]).loc[lambda x: x]
       .index
      )

out = df.loc[idx]

输出:

     Time        State     ID Ref Name
1   10:00  In-progress  54887   2  Jon
3   10:00  In-progress  54887   4  Sam
5   11:00  In-progress  54887   2  Jon
7   11:00  In-progress  54887   4  Sam
9   12:00  In-progress  54887   2  Jon
11  12:00  In-progress  54887   4  Sam
17  10:00  In-progress  65228   b  Lot
19  10:00  In-progress  65228   d  Tom
21  11:00  In-progress  65228   b  Lot
23  11:00  In-progress  65228   d  Tom
25  12:00  In-progress  65228   b  Lot
27  12:00  In-progress  65228   d  Tom

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2018-04-27
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多