You need to enable JavaScript to run this app. 使用pandas按子集分组、以y步长计算每x行的数值均值
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas按子集分组、以y步长计算每x行的数值均值

pandas实现分组内自定义行数窗口、指定步长的滑动均值统计

实现前置规则

  • 处理每个Subset分组时,必须先按Position列升序排序,保证行顺序和实际位置先后逻辑一致
  • 窗口定义为分组内连续的x行数据,而非按Position数值跨度划定区间,不受Position不等间隔的影响,与示例统计逻辑完全匹配

完整可运行代码

import pandas as pd

# 构造示例数据集
data = [
    (1, 1, 2), (1, 10, 3), (1, 15, 0.285714), (1, 43, 1), (1, 48, 0),
    (1, 89, 2), (1, 132, 2), (1, 152, 0.285714), (1, 189, 0.133333), (1, 200, 0),
    (2, 1, 0.133333), (2, 10, 0), (2, 15, 2), (2, 33, 2), (2, 36, 0.285714),
    (2, 72, 2), (2, 132, 0.133333), (2, 152, 0.133333), (2, 220, 3),
    (2, 250, 8), (2, 350, 6), (2, 750, 0)
]
df = pd.DataFrame(data, columns=["Subset", "Position", "Value"])

# 可调整的核心参数
window_rows = 5   # 单窗口包含的连续行数x
step_rows = 2     # 窗口单次滑动的步长y

result_records = []
# 按Subset做分组隔离处理
for subset_id, group in df.groupby("Subset"):
    # 按Position排序并重置索引
    sorted_group = group.sort_values("Position").reset_index(drop=True)
    total_rows = len(sorted_group)
    # 遍历所有合法的窗口起始位置
    for start_idx in range(0, total_rows - window_rows + 1, step_rows):
        # 切取连续x行构成的窗口
        window = sorted_group.iloc[start_idx:start_idx + window_rows]
        result_records.append({
            "Subset": subset_id,
            "Start_position": window["Position"].iloc[0],
            "End_position": window["Position"].iloc[-1],
            "Mean": window["Value"].mean()
        })

# 生成最终结果表
result_df = pd.DataFrame(result_records)

结果校验说明

  • 当参数设置为window_rows=5、step_rows=2时,代码输出结果与示例给出的统计值完全匹配:
    • Subset=1 共生成3个有效窗口
    • Subset=2 共生成4个有效窗口
  • 处理逻辑不会出现跨Subset取数的问题,所有窗口长度固定为x行,不会出现行数不足的截断窗口
  • 窗口的起止Position直接取自切片首尾行的真实值,无需手动映射计算,避免Position不连续导致的数值偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 11:15:06