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

如何将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)

关键说明

  1. 为什么用Pandas DataFrame:

    • 百万级数据下,Pandas的向量化操作比纯列表循环效率高几个数量级,底层基于numpy实现,能高效处理大数据量。
    • 滑动窗口rolling函数封装了窗口边界处理逻辑,无需手动编写复杂循环。
  2. F列的高效实现:

    • 用rolling.apply结合自定义函数,每个窗口仅需3次数据对比,百万级数据的处理时间在可接受范围内。
    • 避免了逐行循环的低效操作,确保处理速度。
  3. 空值处理:

    • 前两行没有完整的3元素窗口,因此C、D列前两行为空,E、F列前两行也对应设为空,和Excel中的逻辑完全一致。

内容的提问来源于stack exchange,提问作者S N B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:54:58