我的数据由记录ID在特定日期处于哪个阶段的行组成。理想情况下,每个ID应该定向地前进到阶段4,尽管它不需要经历每个阶段。例如,下面的ID“A”经过了阶段1->2->4。有时(由于各种可能的原因),一个ID会返回到前一个阶段。数据按每个ID中的日期排序:
df = pd.DataFrame( {"ID": ["A","A","A","B","B","B","B","B","B","C","C","C","C","C","C"], "Stage":[4,2,1,4,3,4,3,2,1,4,3,2,1,2,1],
"Date":['2022-09-18','2022-09-17','2022-09-16','2022-09-20','2022-09-19','2022-09-18','2022-09-17','2022-09-16','2022-09-15',
'2022-09-20','2022-09-19','2022-09-18','2022-09-17','2022-09-16','2022-09-15']} )
print(df)
ID Stage Date
0 A 4 2022-09-18
1 A 2 2022-09-17
2 A 1 2022-09-16
3 B 4 2022-09-20
4 B 3 2022-09-19
5 B 4 2022-09-18
6 B 3 2022-09-17
7 B 2 2022-09-16
8 B 1 2022-09-15
9 C 4 2022-09-20
10 C 3 2022-09-19
11 C 2 2022-09-18
12 C 1 2022-09-17
13 C 2 2022-09-16
14 C 1 2022-09-15
我想删除每个ID在最近一次被发送回上一阶段之前出现的所有数据行。我会得到这样的东西:
print(df_filtered)
ID Stage Date
0 A 4 2022-09-18
1 A 2 2022-09-17
2 A 1 2022-09-16
3 B 4 2022-09-20
4 B 3 2022-09-19
5 C 4 2022-09-20
6 C 3 2022-09-19
7 C 2 2022-09-18
8 C 1 2022-09-17
请注意,A在流程中的方向性移动时没有变化,B在2022-09-19返回到阶段3之前丢弃了所有数据,而C在2022-09-17返回到阶段1之前丢弃了这两行。这是一个非常简单的情况,但在真实数据中,ID可能会多次返回到前一阶段,包括在同一阶段内。例如,可能会将ID从阶段2发送回阶段2。
有没有一种不使用for循环就能从df到df_filtered的干净方法?
1条答案
按热度按时间p8h8hvxi1#
IIUC,对日期进行排序,然后按组,检查阶段是否增加,然后丢弃值:
输出:
中间体: