使用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
相关产品推荐
相关产品推荐

