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

如何用Python Pandas实现分组的累计前序最小值计算

实现方法

核心思路是利用Pandas的分组、排序和累积计算能力,全程避免循环:

  1. 转换日期格式:先把Date列转为datetime类型,保证日期排序的准确性。
  2. 保留原索引:创建临时列记录原始行顺序,后续用来恢复结果的初始排列。
  3. 分组计算并偏移结果:按Name和Subj分组,每个分组内按日期升序排序,计算Score的累积最小值(cummin()),再通过shift(1)将结果上移一行——这样当前行的结果就是该分组内所有早于当前日期的Score最小值。
  4. 恢复原顺序并格式化:按临时索引列排序,删掉临时列,最后将结果保留两位小数匹配示例格式。

完整代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54