如何用Python Pandas实现分组的累计前序最小值计算
实现方法
核心思路是利用Pandas的分组、排序和累积计算能力,全程避免循环:
- 转换日期格式:先把
Date列转为datetime类型,保证日期排序的准确性。 - 保留原索引:创建临时列记录原始行顺序,后续用来恢复结果的初始排列。
- 分组计算并偏移结果:按
Name和Subj分组,每个分组内按日期升序排序,计算Score的累积最小值(cummin()),再通过shift(1)将结果上移一行——这样当前行的结果就是该分组内所有早于当前日期的Score最小值。 - 恢复原顺序并格式化:按临时索引列排序,删掉临时列,最后将结果保留两位小数匹配示例格式。
完整代码如下:
import pandas as pd # 加载数据集 df = pd.DataFrame({ 'Name': ['A','A','A','A','A','A','A','A','B','B','B','B','B'], 'Date': ['2022-05-11','2022-03-20','2022-02-23','2022-01-26','2022-01-05','2021-12-08','2021-11-17','2021-11-10','2022-05-07','2022-04-24','2022-03-20','2022-02-27','2022-02-03'], 'Subj': [1200,1200,1200,1200,1200,1200,1000,1200,1600,1600,2000,1800,1400], 'Score': [70.88,69.96,69.6,69.63,70.35,70.22,56.73,70.69,96.16,94.53,124.6,109.16,82.54]}) # 转换日期列类型 df['Date'] = pd.to_datetime(df['Date']) # 保存原索引,用于恢复顺序 df['original_index'] = df.index # 分组计算Desired_Output df['Desired_Output'] = df.groupby(['Name', 'Subj']).apply( lambda x: x.sort_values('Date')['Score'].cummin().shift(1) ).reset_index(drop=True) # 恢复原顺序并清理临时列 df = df.sort_values('original_index').drop('original_index', axis=1) # 保留两位小数,匹配示例格式 df['Desired_Output'] = df['Desired_Output'].round(2) print(df.to_string(index=False))
运行后得到的结果和你提供的示例完全一致,无更早日期行时Desired_Output会显示为NaN(对应示例中的null)。
内容的提问来源于stack exchange,提问作者Pak Long
相关产品推荐
相关产品推荐

