根据列值更改在 pandas 数据框中选择所需的行组

Selecting the desired rows group by in pandas dataframe based on column value change

我有源数据框,如下所示。

order_id prod_id date authorized
111 P 2022-01-01 00:00:00 N
111 P 2022-01-02 00:00:00 N
111 P 2022-01-03 00:00:00 Y
111 Q 2022-01-02 00:00:00 Y
112 P 2022-01-01 00:00:00 N
112 P 2022-01-02 00:00:00 Y
112 Q 2022-01-01 00:00:00 N
112 Q 2022-01-02 00:00:00 N
112 Q 2022-01-03 00:00:00 N
112 Q 2022-01-04 00:00:00 N
113 P 2022-01-01 00:00:00 N
113 P 2022-01-02 00:00:00 Y
113 P 2022-01-03 00:00:00 Y
113 P 2022-01-04 00:00:00 Y
113 P 2022-01-05 00:00:00 Y
114 Z 2022-01-05 00:00:00 Y

我的目标是创建如下所示的目标数据框

这是创建目标数据框要实现的逻辑:

a) 对于 order_id 和 prod_id 组合取第一行(按日期升序排序),其中 authorized=Y

b) 对于订单id和prod id的组合,如果none条记录已经授权='Y',取第一行,按日期升序排列。

在 Pandas 中,有什么方法可以有效地实现这一点?我做了一些谷歌搜索,但找不到解决方案。提前致谢。

authorizeddate 列对数据框进行排序,然后按 order_idproduct_id 列分组。最后得到每组的第一行。

# Convert date as datetime64
df['date'] = pd.to_datetime(df['date'], dayfirst=False)

out = df.sort_values(['authorized', 'date'], ascending=[False, True]) \
        .groupby(['order_id', 'prod_id']).first().reset_index()
print(out)

# Output
   order_id prod_id       date authorized
0       111       P 2022-01-03          Y
1       111       Q 2022-01-02          Y
2       112       P 2022-01-02          Y
3       112       Q 2022-01-01          N
4       113       P 2022-01-02          Y
5       114       Z 2022-01-05          Y