Pandas多条件分组:按Article取最大Launch后取最小Sequence及对应Machine
问题描述
原始DataFrame结构
Launch Article Sequence Machine Quantity Date … 68033 F2500 10 lathe 1 200 01/02/2022 … 68033 F2500 20 lathe 1 190 01/02/2022 … 68033 F2500 30 borer 3 175 02/02/2022 … 68033 F2500 40 milling 1 175 03/03/2022 … 71562 F2500 10 lathe 3 632 12/12/2022 … 71562 F2500 20 lathe 4 593 15/12/2022 … 71562 F2500 30 borer 3 560 16/12/2022 … 71562 F2500 40 milling 2 555 16/12/2022 … 69872 F302 10 lathe 2 5463 04/06/2022 … 69872 F302 30 lathe 3 5102 11/06/2022 … 70444 F302 20 lathe 1 3125 27/07/2022 … 70444 F302 30 lathe 3 2965 31/07/2022 … … … … … … … … 124.531 rows x 12 columns
需求
按Article分组,完成两步筛选:
- 选取每个
Article对应的最大Launch值 - 在该
Launch对应的所有记录中,选取最小的Sequence值及其对应的Machine
期望结果:
Article Launch Sequence Machine F2500 71562 10 lathe 3 F302 70444 20 lathe 1 … … … …
尝试的错误方法
使用groupby+agg直接聚合,代码如下:
Last_Lathe_df = Last_Lathe_df.groupby(['Article'], as_index=False).agg({'Launch': 'max', 'Sequence': 'min', 'Machine': 'first'})
该方法错误原因:agg会对每个列单独执行聚合逻辑,Sequence: 'min'取的是整个Article分组内的全局最小值,而非对应最大Launch记录中的最小值,导致结果不符合需求。
解决方案
方法一:分步筛选(逻辑清晰)
- 先获取每个
Article的最大Launch值 - 筛选出原DataFrame中符合该
Launch的所有记录 - 在筛选后的记录中,找到每个
Article下Sequence最小的行
代码示例:
# 1. 获取每个Article的最大Launch max_launch = Last_Lathe_df.groupby('Article')['Launch'].max().reset_index() # 2. 筛选出所有属于最大Launch的记录 filtered = Last_Lathe_df.merge(max_launch, on=['Article', 'Launch']) # 3. 按Article和Sequence排序,去重保留最小Sequence的行 result = filtered.sort_values(by=['Article', 'Sequence'], ascending=[True, True])\ .drop_duplicates(subset='Article', keep='first')\ [['Article', 'Launch', 'Sequence', 'Machine']]
方法二:排序+去重(简洁高效)
通过排序让目标行排在每个Article分组的最前面,再去重保留第一行:
- 按
Article升序排序(保证同组在一起) - 按
Launch降序排序(最大的Launch排在同组最前) - 按
Sequence升序排序(同Launch下最小的Sequence排在最前)
代码示例:
# 按指定规则排序 sorted_df = Last_Lathe_df.sort_values( by=['Article', 'Launch', 'Sequence'], ascending=[True, False, True] ) # 按Article去重,保留第一个行(即目标行) result = sorted_df.drop_duplicates(subset='Article', keep='first')\ [['Article', 'Launch', 'Sequence', 'Machine']]
内容的提问来源于stack exchange,提问作者Piazza
相关产品推荐
相关产品推荐

