如何将Excel多列滑动窗口计算转换为Python DataFrame处理?
用Pandas处理百万级传感器数据的滑动窗口计算
以下是完整的Python实现代码,覆盖你需要的所有列计算,重点解决F列的核心需求:
步骤1:导入依赖并初始化数据
import pandas as pd import numpy as np # 假设你的传感器数据列表是sensor_data(对应Excel中的B列) sensor_data = [你的B列数据列表] # 创建DataFrame,自动生成A列序号slno(从1开始) df = pd.DataFrame({ 'slno': range(1, len(sensor_data)+1), 'data': sensor_data })
步骤2:计算C列(3元素滑动窗口平均值)
对应Excel中C4=AVERAGE(B2:B4)的逻辑,滑动窗口函数会自动将结果对应到窗口最后一行的位置:
# window=3表示窗口大小为3,结果对应窗口最后一个元素的行 df['C'] = df['data'].rolling(window=3).mean()
步骤3:计算D列(对应窗口的最大值)
和平均值逻辑一致,用滑动窗口直接求最大值:
df['D'] = df['data'].rolling(window=3).max()
步骤4:计算E列(判断相邻窗口最大值是否连续重复)
判断当前行的窗口最大值是否和上一行的窗口最大值相等,相等标记为yes,否则为no:
# 用shift(1)获取上一行的D列值,eq()判断是否相等 df['E'] = np.where(df['D'].eq(df['D'].shift(1)), 'yes', 'no') # 前两行没有完整的前序窗口,将E列前两行设为空 df.loc[:1, 'E'] = np.nan
步骤5:计算F列(E列为yes时,取窗口中第一个等于最大值的序号)
这是核心步骤,通过滑动窗口自定义函数定位目标序号,再结合E列条件填充:
# 定义滑动窗口处理函数:输入窗口的DataFrame,返回第一个等于最大值的slno def get_first_matching_slno(window): max_val = window['data'].max() # 找到窗口中第一个等于最大值的行,返回其slno return window[window['data'] == max_val]['slno'].iloc[0] # 计算每个窗口对应的第一个匹配slno,raw=False表示传入窗口的完整DataFrame df['first_slno'] = df.rolling(window=3).apply(get_first_matching_slno, raw=False) # 仅在E列为yes时填充F列,否则为空 df['F'] = np.where(df['E'] == 'yes', df['first_slno'], np.nan) # 可选:删除中间辅助列first_slno # df.drop('first_slno', axis=1, inplace=True)
关键说明
为什么用Pandas DataFrame:
- 百万级数据下,Pandas的向量化操作比纯列表循环效率高几个数量级,底层基于numpy实现,能高效处理大数据量。
- 滑动窗口
rolling函数封装了窗口边界处理逻辑,无需手动编写复杂循环。
F列的高效实现:
- 用
rolling.apply结合自定义函数,每个窗口仅需3次数据对比,百万级数据的处理时间在可接受范围内。 - 避免了逐行循环的低效操作,确保处理速度。
- 用
空值处理:
- 前两行没有完整的3元素窗口,因此C、D列前两行为空,E、F列前两行也对应设为空,和Excel中的逻辑完全一致。
内容的提问来源于stack exchange,提问作者S N B
相关产品推荐
相关产品推荐

