根据列值更改在 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 中,有什么方法可以有效地实现这一点?我做了一些谷歌搜索,但找不到解决方案。提前致谢。
按 authorized
和 date
列对数据框进行排序,然后按 order_id
和 product_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
我有源数据框,如下所示。
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 中,有什么方法可以有效地实现这一点?我做了一些谷歌搜索,但找不到解决方案。提前致谢。
按 authorized
和 date
列对数据框进行排序,然后按 order_id
和 product_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