[英]Filter grouped data based on stage ordering
我的數據由記錄 ID 在特定日期所處階段的行組成。 理想情況下,每個 ID 都應該定向進入第 4 階段,盡管它不需要通過每個階段 go。 例如,下面的 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 年 9 月 19 日將其發送回第 3 階段之前已刪除所有數據,並且 C 在 2022 年返回第 1 階段之前已刪除了兩行-09-17。 這是一個大大簡化的情況,但在真實數據中,一個 ID 可能會多次返回到前一階段,包括在同一階段內。 例如,一個 ID 可能會從階段 2 發送回階段 2。
有沒有不使用 for 循環從 df 到 df_filtered 的干凈方法?
IIUC,對日期進行排序,然后按組,檢查 Stage 是否增加,然后刪除值:
m = (df
# ensure the dates are in decreasing order
# optional if the dates are already in descending order
.sort_values(by=['ID', 'Date'], ascending=[True, False])
# for each group, if Stage increases, flag this and the successive rows
.groupby('ID')['Stage'].apply(lambda x: x.diff().gt(0).cummax())
)
# select the non-flagged rows
out = df[~m]
output:
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
9 C 4 2022-09-20
10 C 3 2022-09-19
11 C 2 2022-09-18
12 C 1 2022-09-17
中間體:
ID Stage Date diff gt(0) cummax
0 A 4 2022-09-18 NaN False False
1 A 2 2022-09-17 -2.0 False False
2 A 1 2022-09-16 -1.0 False False
3 B 4 2022-09-20 NaN False False
4 B 3 2022-09-19 -1.0 False False
5 B 4 2022-09-18 1.0 True True
6 B 3 2022-09-17 -1.0 False True
7 B 2 2022-09-16 -1.0 False True
8 B 1 2022-09-15 -1.0 False True
9 C 4 2022-09-20 NaN False False
10 C 3 2022-09-19 -1.0 False False
11 C 2 2022-09-18 -1.0 False False
12 C 1 2022-09-17 -1.0 False False
13 C 2 2022-09-16 1.0 True True
14 C 1 2022-09-15 -1.0 False True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.