如何在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:实现前序分组的最值追踪
原代码逻辑无法正确传递前序分组的最值,正确做法是先提取分组级别的统计结果,再移位映射回原表:
- 提取每个分组的唯一最值记录(每个分组仅保留一条):
group_stats = df.groupby('groupid')[['min', 'max']].first().reset_index()
- 计算分组的前一个、前两个分组的最值,空值用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)
- 将分组统计结果合并回原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
相关产品推荐
相关产品推荐

