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

如何提取DataFrame中Duration列各连续Code序列的最大值?

按连续重复的Code序列提取Duration列的最大值

我有如下结构的DataFrame:

import pandas as pd

df = pd.DataFrame({
    'Country': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
    'Code': [1, 1, 1, 1, 2, 2, 1, 1, 1],
    'Duration': [0, 1, 2, 3, 0, 1, 0, 1, 2]
})

我需要从Duration列中提取每个连续相同Code序列对应的最大值,而不是全局或所有相同Code的最大值,期望输出如下:

Country  Code  Duration
0       A     1         3
1       A     2         1
2       A     1         2

直接按Code分组不行,因为Code会频繁重复出现,无法区分不同的连续序列,求解决思路和实现方法。


这个问题的核心是区分“连续相同的Code序列”和“所有相同的Code”,直接分组肯定不行,我们可以通过给每个连续序列分配唯一标识的方式来解决,具体步骤如下:

解决思路

  1. 生成连续分组标识:通过对比当前行的Code与上一行的Code,标记出每个连续序列的起始点,再通过累加得到每个连续序列的唯一ID;
  2. 按分组标识聚合:结合Country和生成的分组ID进行分组,提取每个组内的Code(同一组内Code一致,取任意值即可)和Duration的最大值;
  3. 整理结果:去掉临时的分组标识列,重置索引得到最终输出。

代码实现

# 生成连续序列的唯一分组ID
df['group_id'] = (df['Code'] != df['Code'].shift()).cumsum()

# 按Country和分组ID聚合,提取目标值
result = df.groupby(['Country', 'group_id']).agg(
    Code=('Code', 'first'),  # 同一组Code相同,取第一个值即可
    Duration=('Duration', 'max')
).reset_index(drop=True)

print(result)

代码解释

  • df['Code'].shift()会把Code列向下偏移一行,和原列对比后,得到的布尔值序列会标记出所有连续序列的起始行(True表示当前行是新序列的开始);
  • cumsum()会把这些布尔值(True=1,False=0)累加,从而给每个连续序列分配唯一的group_id,这样即使Code重复出现,不同位置的连续序列也会被区分开;
  • 最后通过分组聚合,就能精准提取每个连续序列的Duration最大值了。

内容的提问来源于stack exchange,提问作者Alex Cranston

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:10:07