根据阶段顺序筛选分组数据

wn9m85ua  于 2022-09-21  发布在  其他
关注(0)|答案(1)|浏览(147)

我的数据由记录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的干净方法?

p8h8hvxi

p8h8hvxi1#

IIUC,对日期进行排序,然后按组,检查阶段是否增加,然后丢弃值:

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]

输出:

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

相关问题