You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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分组,完成两步筛选:

  1. 选取每个Article对应的最大Launch值
  2. 在该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记录中的最小值,导致结果不符合需求。


解决方案

方法一:分步筛选(逻辑清晰)

  1. 先获取每个Article的最大Launch值
  2. 筛选出原DataFrame中符合该Launch的所有记录
  3. 在筛选后的记录中,找到每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:27:08