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

如何在Pandas中高效获取当前行与前n行的列最小值?

更优雅地计算当前行与后续n行的最小值

你说得对,当需要扩展到前n行(从你的示例来看,实际是当前行加上后续n行,如果我理解错了可以随时调整)时,手动创建shift(-1)、shift(-2)这类列的方法会变得非常繁琐——不仅要写大量重复代码,还会额外占用内存存储这些中间列。这里有两种更优的实现方式,不管n是多少都能轻松应对:

方法一:利用Pandas Rolling窗口(简洁易读)

Pandas的rolling默认是向前滑动窗口,我们可以通过反转数组的方式实现向后滑动窗口,从而一次性计算出当前行与后续n行的最小值:

import pandas as pd

# 示例数据集
df = pd.DataFrame([12,11,4,15,6], columns=['score'])
n = 2  # 需要包含的后续行数,总窗口大小为n+1

# 反转数组后执行rolling,再反转回来得到结果
df['Minimum'] = df['score'][::-1].rolling(window=n+1, min_periods=1).min()[::-1]

运行后得到的结果和你手动创建列的结果完全一致:

score  Minimum
0     12      4.0
1     11      4.0
2      4      4.0
3     15      6.0
4      6      6.0

优点:

  • 代码简洁,一行搞定,可读性强
  • 不需要创建任何中间列,节省内存
  • 调整n只需要修改一个参数,扩展性极佳

方法二:Numpy滑动窗口(性能最优)

如果你的数据集非常大,追求极致性能的话,可以用Numpy的sliding_window_view来创建滑动窗口,直接对数组进行计算,速度会比Pandas更快:

import numpy as np
import pandas as pd

df = pd.DataFrame([12,11,4,15,6], columns=['score'])
n = 2
window_size = n + 1
score_arr = df['score'].values

# 创建滑动窗口:每个窗口包含当前元素和后续n个元素
sliding_windows = np.lib.stride_tricks.sliding_window_view(score_arr, window_size)
# 计算每个窗口的最小值
window_mins = sliding_windows.min(axis=1)

# 处理末尾不足window_size的部分(比如最后n行)
remaining_indices = range(len(score_arr) - window_size + 1, len(score_arr))
remaining_mins = np.array([score_arr[i:].min() for i in remaining_indices])

# 合并结果到DataFrame
df['Minimum'] = np.concatenate([window_mins, remaining_mins])

优点:

  • 基于Numpy底层实现,处理大数据集时性能远超Pandas方法
  • 直接操作数组,内存占用更低

补充:如果是当前行与前面n行的最小值

如果你实际需求是当前行加上前面n行的最小值(比如行2的最小值是12、11、4),那更简单,直接用默认的向前Rolling窗口即可:

df['Minimum'] = df['score'].rolling(window=n+1, min_periods=1).min()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:19