如何在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
相关产品推荐
相关产品推荐

