[英]Getting the Last and 3rd Last Records in a Dataframe Based on Criteria
I have a large dataframe (extract below) and want to create a new dataframe containing the last "In-progress" row and the 3rd last "In-progress" row based on the Time for each ID.我有一个大的 dataframe(下面摘录),我想创建一个新的 dataframe,其中包含基于每个 ID 的时间的最后一个“进行中”行和倒数第三个“进行中”行。
I am new to Pandas and can't work out how to do it.我是 Pandas 的新手,不知道该怎么做。 Any help would be appreciated.任何帮助,将不胜感激。
Dataframe: Dataframe:
Time时间 | State State | ID ID | Ref参考 | Name姓名 |
---|---|---|---|---|
10:00 10:00 | In-progress进行中 | 54887 54887 | 1 1个 | Jim吉姆 |
10:00 10:00 | In-progress进行中 | 54887 54887 | 2 2个 | Jon乔恩 |
10:00 10:00 | In-progress进行中 | 54887 54887 | 3 3个 | Rob抢 |
10:00 10:00 | In-progress进行中 | 54887 54887 | 4 4个 | Sam山姆 |
11:00 11:00 | In-progress进行中 | 54887 54887 | 1 1个 | Jim吉姆 |
11:00 11:00 | In-progress进行中 | 54887 54887 | 2 2个 | Jon乔恩 |
11:00 11:00 | In-progress进行中 | 54887 54887 | 3 3个 | Rob抢 |
11:00 11:00 | In-progress进行中 | 54887 54887 | 4 4个 | Sam山姆 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 1 1个 | Jim吉姆 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 2 2个 | Jon乔恩 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 3 3个 | Rob抢 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 4 4个 | Sam山姆 |
13:00 13:00 | Done完毕 | 54887 54887 | 1 1个 | Jim吉姆 |
13:00 13:00 | Done完毕 | 54887 54887 | 2 2个 | Jon乔恩 |
13:00 13:00 | Done完毕 | 54887 54887 | 3 3个 | Rob抢 |
13:00 13:00 | Done完毕 | 54887 54887 | 4 4个 | Sam山姆 |
10:00 10:00 | In-progress进行中 | 65228 65228 | a一种 | Anya安雅 |
10:00 10:00 | In-progress进行中 | 65228 65228 | b b | Lot很多 |
10:00 10:00 | In-progress进行中 | 65228 65228 | c c | Ted泰德 |
10:00 10:00 | In-progress进行中 | 65228 65228 | d d | Tom汤姆 |
11:00 11:00 | In-progress进行中 | 65228 65228 | a一种 | Anya安雅 |
11:00 11:00 | In-progress进行中 | 65228 65228 | b b | Lot很多 |
11:00 11:00 | In-progress进行中 | 65228 65228 | c c | Ted泰德 |
11:00 11:00 | In-progress进行中 | 65228 65228 | d d | Tom汤姆 |
12:00 12:00 | In-progress进行中 | 65228 65228 | a一种 | Anya安雅 |
12:00 12:00 | In-progress进行中 | 65228 65228 | b b | Lot很多 |
12:00 12:00 | In-progress进行中 | 65228 65228 | c c | Ted泰德 |
12:00 12:00 | In-progress进行中 | 65228 65228 | d d | Tom汤姆 |
13:00 13:00 | Done完毕 | 65228 65228 | a一种 | Anya安雅 |
13:00 13:00 | Done完毕 | 65228 65228 | b b | Lot很多 |
13:00 13:00 | Done完毕 | 65228 65228 | c c | Ted泰德 |
13:00 13:00 | Done完毕 | 65228 65228 | d d | Tom汤姆 |
Desired Result:期望的结果:
Time时间 | State State | ID ID | Ref参考 | Name姓名 |
---|---|---|---|---|
10:00 10:00 | In-progress进行中 | 54887 54887 | 1 1个 | Jim吉姆 |
10:00 10:00 | In-progress进行中 | 54887 54887 | 2 2个 | Jon乔恩 |
10:00 10:00 | In-progress进行中 | 54887 54887 | 3 3个 | Rob抢 |
10:00 10:00 | In-progress进行中 | 54887 54887 | 4 4个 | Sam山姆 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 1 1个 | Jim吉姆 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 2 2个 | Jon乔恩 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 3 3个 | Rob抢 |
12:00 12:00 | In-progress进行中 | 54887 54887 | 4 4个 | Sam山姆 |
10:00 10:00 | In-progress进行中 | 65228 65228 | a一种 | Anya安雅 |
10:00 10:00 | In-progress进行中 | 65228 65228 | b b | Lot很多 |
10:00 10:00 | In-progress进行中 | 65228 65228 | c c | Ted泰德 |
10:00 10:00 | In-progress进行中 | 65228 65228 | d d | Tom汤姆 |
12:00 12:00 | In-progress进行中 | 65228 65228 | a一种 | Anya安雅 |
12:00 12:00 | In-progress进行中 | 65228 65228 | b b | Lot很多 |
12:00 12:00 | In-progress进行中 | 65228 65228 | c c | Ted泰德 |
12:00 12:00 | In-progress进行中 | 65228 65228 | d d | Tom汤姆 |
Use groupby.tail
:使用groupby.tail
:
out = (df[df['State'].eq('In-progress')]
.groupby(['Time', 'ID']).tail(3)
)
Output: Output:
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
Use groupby.cumcount
:使用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]
Output: Output:
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
get last and last-3 time per id获取每个 ID 的最后一次和最后 3 次
df1 = (df[df['State'].eq('In-progress')]
.drop_duplicates(['ID', 'Time'])
.groupby('ID')['Time'].nth([-3, -1]).reset_index())
df1
ID Time
0 54887 10:00
1 54887 12:00
2 65228 10:00
3 65228 12:00
filtering df
by merge
通过merge
过滤df
df1.merge(df, how='left').reindex(columns=df.columns)
result:结果:
Time State ID Ref Name
0 10:00 In-progress 54887 1 Jim
1 10:00 In-progress 54887 2 Jon
2 10:00 In-progress 54887 3 Rob
3 10:00 In-progress 54887 4 Sam
4 12:00 In-progress 54887 1 Jim
5 12:00 In-progress 54887 2 Jon
6 12:00 In-progress 54887 3 Rob
7 12:00 In-progress 54887 4 Sam
8 10:00 In-progress 65228 a Anya
9 10:00 In-progress 65228 b Lot
10 10:00 In-progress 65228 c Ted
11 10:00 In-progress 65228 d Tom
12 12:00 In-progress 65228 a Anya
13 12:00 In-progress 65228 b Lot
14 12:00 In-progress 65228 c Ted
15 12:00 In-progress 65228 d Tom
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.