如何提取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”,直接分组肯定不行,我们可以通过给每个连续序列分配唯一标识的方式来解决,具体步骤如下:
解决思路
- 生成连续分组标识:通过对比当前行的
Code与上一行的Code,标记出每个连续序列的起始点,再通过累加得到每个连续序列的唯一ID; - 按分组标识聚合:结合
Country和生成的分组ID进行分组,提取每个组内的Code(同一组内Code一致,取任意值即可)和Duration的最大值; - 整理结果:去掉临时的分组标识列,重置索引得到最终输出。
代码实现
# 生成连续序列的唯一分组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
相关产品推荐
相关产品推荐

