如何在Pandas DataFrame中按行计算窗口大小为5的最大值?
按行计算固定窗口大小的最大值
针对你需要对大型DataFrame按行计算窗口大小为5的最大值的需求,这里提供两种高效的实现方法,以你给出的3行15列示例DataFrame为例:
方法一:利用Numpy数组重构(高效推荐)
通过将DataFrame转换为Numpy数组后重构形状,直接按窗口维度取最大值,适合处理大规模数据:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame() df['a'] = [1, 0, 1] df['b'] = [10,12,4] df['c'] = [10, 0, 6] df['d'] = [10,102,1] df['aa'] = [-1, 10, 21] df['bb'] = [10,12,31] df['ac'] = [-1, 0, 41] df['bv'] = [20,121,11] df['a1'] = [3, 10, 1] df['bx'] = [10,12,51] df['ad'] = [6, 10, 1] df['bn'] = [101,12,31] df['aq'] = [2, 0, 1] df['bp'] = [1,112,12] df['ak'] = [23, 0, 1] # 核心逻辑:重构数组形状后按窗口取最大值 result = pd.DataFrame( df.values.reshape(-1, len(df.columns)//5, 5).max(axis=2), columns=['v1', 'v2', 'v3'] ) print(result)
逻辑说明:
df.values获取DataFrame的底层Numpy数组,形状为(3,15).reshape(-1, 3, 5)将数组重构为(行数, 窗口数, 窗口大小),其中-1自动匹配原行数,3是15//5得到的窗口数量,5是窗口大小.max(axis=2)沿着窗口内的列维度(第三个轴)计算最大值,得到形状为(3,3)的结果数组- 转换为DataFrame并指定列名,得到预期输出
方法二:Pandas分组计算
通过对列索引进行分组,每5列分为一组,再计算每行的最大值:
import pandas as pd import numpy as np # 构造示例DataFrame(同上,省略重复代码) # 按列索引每5个分组,计算每行最大值 result = df.groupby(np.arange(len(df.columns)) // 5, axis=1).max() # 重命名列名 result.columns = [f'v{i+1}' for i in range(result.shape[1])] print(result)
逻辑说明:
np.arange(len(df.columns))//5生成列分组标签:前5列标签为0,中间5列为1,最后5列为2groupby(..., axis=1)指定按列方向分组.max()对每个分组计算每行的最大值- 最后重命名列名以匹配预期输出
两种方法都能得到你需要的结果,其中Numpy数组重构的方法在处理大型DataFrame时性能更优。
内容的提问来源于stack exchange,提问作者Sadcow
相关产品推荐
相关产品推荐

