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

如何在DataFrame中为每个分组新增列存储前序分组的最值?

在DataFrame中跟踪每行的前序分组最值

需求:在DataFrame的每一行中,记录当前分组的前一个分组、前两个分组的最小值和最大值(分别对应pmin/pmax、ppmin/ppmax),同时保留当前分组自身的最值。


步骤1:创建输入数据

import pandas as pd
columns = ['timestamp','groupid','value']
data =      [['2022-10-14 11:47:38',1000,200],
            ['2022-10-14 11:47:39',1000,210],
            ['2022-10-14 11:47:40',1000,220],
            ['2022-10-14 11:47:41',1000,230],
            ['2022-10-14 11:47:42',1001,240],
            ['2022-10-14 11:47:43',1001,250],
            ['2022-10-14 11:47:44',1002,260],
            ['2022-10-14 11:47:45',1002,270]]

df = pd.DataFrame(data=data,columns=columns)
print(df)

步骤2:计算每个分组自身的最值

通过groupby.transform给每行添加当前分组的最小、最大值:

df['min'] = df.groupby('groupid')['value'].transform('min')
df['max'] = df.groupby('groupid')['value'].transform('max')

步骤3:实现前序分组的最值追踪

原代码逻辑无法正确传递前序分组的最值,正确做法是先提取分组级别的统计结果,再移位映射回原表:

  1. 提取每个分组的唯一最值记录(每个分组仅保留一条):
group_stats = df.groupby('groupid')[['min', 'max']].first().reset_index()
  1. 计算分组的前一个、前两个分组的最值,空值用0填充:
group_stats['pmin'] = group_stats['min'].shift(1).fillna(0)
group_stats['pmax'] = group_stats['max'].shift(1).fillna(0)
group_stats['ppmin'] = group_stats['min'].shift(2).fillna(0)
group_stats['ppmax'] = group_stats['max'].shift(2).fillna(0)
  1. 将分组统计结果合并回原DataFrame:
df = df.merge(group_stats[['groupid', 'pmin', 'pmax', 'ppmin', 'ppmax']], on='groupid', how='left')

预期输出构造代码

columns2 = ['timestamp','groupid','value','min','max','pmin','pmax','ppmin','ppmax']
data2 =      [['2022-10-14 11:47:38',1000,200,200,230,0,0,0,0],
            ['2022-10-14 11:47:39',1000,210,200,230,0,0,0,0],
            ['2022-10-14 11:47:40',1000,220,200,230,0,0,0,0],
            ['2022-10-14 11:47:41',1000,230,200,230,0,0,0,0],
            ['2022-10-14 11:47:42',1001,240,240,250,200,230,0,0],
            ['2022-10-14 11:47:43',1001,250,240,250,200,230,0,0],
            ['2022-10-14 11:47:44',1002,260,260,270,240,250,200,230],
            ['2022-10-14 11:47:45',1002,270,260,270,240,250,200,230]]
df_expected = pd.DataFrame(data=data2,columns=columns2)
print(df_expected)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:42:16