按Sequence ID分组筛选对应最大Duration的SubSeq列组合
解决方法:用Pandas处理宽表转长表后筛选最大值
我来帮你搞定这个需求,核心思路是先把你的宽格式DataFrame转成更方便处理的长格式,再按Sequence ID分组筛选出Duration最大的记录。下面是具体步骤和代码:
1. 准备输入数据
首先我们先把你给出的输入数据构造成Pandas DataFrame:
import pandas as pd # 构造输入数据 data = { 'Sequence': [1001, 1001, 1001, 1002, 1002, 1003, 1003, 1004, 1004, 1004], 'SubSeq1': [145, 475, 685, 125, 475, 325, 125, 129, 547, 666], 'Duration1': [0, 20, 57, 54, 21, 68, 97, 15, 47, 65], 'SubSeq2': [125, 175, 687, 175, 467, 301, 325, 429, 577, 722], 'Duration2': [53, 54, 77, 96, 32, 54, 85, 41, 52, 63], 'SubSeq3': [458, 652, 254, 786, 526, 529, 872, 981, 543, 257], 'Duration3': [33, 45, 88, 26, 32, 41, 78, 82, 83, 85] } df = pd.DataFrame(data)
2. 宽表转长表
你的数据里SubSeqN和DurationN是成对的列,我们可以用pd.wide_to_long把它们转换成统一的SubSeq和Duration列,这样后续筛选会更简单:
# 转换为长格式 long_df = pd.wide_to_long( df, stubnames=['SubSeq', 'Duration'], # 列名的前缀 i='Sequence', # 索引列,这里是Sequence ID j='seq_num', # 生成的新列,用来标记原来的组号(1/2/3) sep='' # 列名里前缀和数字之间没有分隔符 ).reset_index()
转换后的长表会把所有的SubSeq和Duration整合到两列里,每个Sequence ID对应原来的所有SubSeq-Duration组合。
3. 按Sequence分组筛选最大值
接下来我们按Sequence分组,找出每个组里Duration最大的那一行。这里可以用groupby结合idxmax()来定位最大值所在的行,再提取这些行:
# 找出每个Sequence中Duration最大的行的索引 max_idx = long_df.groupby('Sequence')['Duration'].idxmax() # 提取对应的行 result_df = long_df.loc[max_idx, ['Sequence', 'SubSeq', 'Duration']].reset_index(drop=True)
4. 查看结果
运行完上面的代码,result_df就是你想要的输出:
Sequence SubSeq Duration 0 1001 254 88 1 1002 175 96 2 1003 125 97 3 1004 257 85
完全符合你给出的期望输出。
补充说明:
如果你的列名有不同的格式(比如带下划线,比如Sub_Seq1),只需要调整wide_to_long里的sep参数就行。另外,如果同一个Sequence里有多个相同的最大Duration,idxmax()会取第一个出现的,要是需要保留所有最大值,可以用transform来筛选:
# 保留所有Duration等于组内最大值的行 result_df = long_df[long_df.groupby('Sequence')['Duration'].transform(max) == long_df['Duration']]
内容的提问来源于stack exchange,提问作者Rohit Lamba
相关产品推荐
相关产品推荐

