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

基于滑动窗口按列分组从Pandas DataFrame构建目标数组的实现方案求助

基于分组Pandas DataFrame构建滑动窗口目标数组

问题描述

我拥有一个包含三列的Pandas DataFrame,希望基于该DataFrame构建一个目标数组。具体需求为:

  • 使用滑动窗口遍历数据行,以DataFrame的b列分组,在每个分组内从第0行开始滑动窗口;
  • 窗口大小设为3时,将窗口内a列的3个值、c列的3个值,以及该分组对应的b列值依次存入目标数组的一行中;
  • 当b列值发生变化时,切换至新的分组重复上述滑动窗口处理流程。

我的DataFrame数据:

import pandas as pd
df = pd.DataFrame()
df ['a'] = [1,2,3,4,5,6,7,8,9,10, 1,2,3]
df ['b'] = [1,1,1,1,2,2,2,2,7,7,7,7,7]
df ['c'] = [-1,1,5,6,7,3,1,6,8,3,9,10,1]

期望得到的目标数组:

array([[ 1, 2, 3, -1, 1, 5, 1],
       [ 2, 3, 4, 1, 5, 6, 1],
       [ 5, 6, 7, 7, 3, 1, 2],
       [ 6, 7, 8, 3, 1, 6, 2],
       [ 9, 10, 1, 8, 3, 9, 7],
       [10, 1, 2, 3, 9, 10, 7],
       [ 1, 2, 3, 9, 10, 1, 7]])

我之前尝试的代码没有实现分组和完整的列拼接,效果不理想:

w = 3
A = np.zeros((w,len(df)-w+1))
for i in range(len(df)-w+1):
    A[:,i] = df.iloc[i:w+i,0]
A = A.T

解决方案

我们可以通过分组遍历+滑动窗口提取的方式来实现需求,核心思路是先按b列分组,再对每个分组单独处理滑动窗口,最后合并所有分组的结果。

完整代码实现

import pandas as pd
import numpy as np

# 定义处理单个分组的函数
def process_group(group, window_size=3):
    # 获取当前分组的b值(整个分组的b值一致)
    b_value = group['b'].iloc[0]
    # 提取a、c列的numpy数组,方便切片操作
    a_data = group['a'].values
    c_data = group['c'].values
    # 计算当前分组可生成的窗口数量
    num_windows = len(a_data) - window_size + 1
    # 存储当前分组的结果
    group_result = []
    
    # 遍历每个滑动窗口的起始索引
    for idx in range(num_windows):
        # 提取窗口内的a、c值
        window_a = a_data[idx:idx+window_size]
        window_c = c_data[idx:idx+window_size]
        # 拼接窗口数据和b值,组成一行
        row = np.concatenate([window_a, window_c, [b_value]])
        group_result.append(row)
    
    return np.array(group_result)

# 初始化你的DataFrame
df = pd.DataFrame()
df ['a'] = [1,2,3,4,5,6,7,8,9,10, 1,2,3]
df ['b'] = [1,1,1,1,2,2,2,2,7,7,7,7,7]
df ['c'] = [-1,1,5,6,7,3,1,6,8,3,9,10,1]

# 按b列分组处理
all_results = []
for _, group in df.groupby('b'):
    group_output = process_group(group)
    all_results.append(group_output)

# 合并所有分组的结果,得到最终目标数组
target_array = np.vstack(all_results)

# 打印验证结果
print(target_array)

代码解释

  1. 分组处理:使用df.groupby('b')将数据按b列的值分成独立的分组,确保每个分组内的滑动窗口不会跨分组执行;
  2. 滑动窗口提取:对每个分组,我们通过遍历起始索引的方式,提取窗口内的a和c列数据,再拼接上当前分组的b值(每个分组的b值固定);
  3. 结果合并:将每个分组生成的子数组合并成最终的目标数组,使用np.vstack()实现垂直拼接。

运行这段代码后,得到的结果就和你期望的目标数组完全一致了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:57:45