基于滑动窗口按列分组从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)
代码解释
- 分组处理:使用
df.groupby('b')将数据按b列的值分成独立的分组,确保每个分组内的滑动窗口不会跨分组执行; - 滑动窗口提取:对每个分组,我们通过遍历起始索引的方式,提取窗口内的
a和c列数据,再拼接上当前分组的b值(每个分组的b值固定); - 结果合并:将每个分组生成的子数组合并成最终的目标数组,使用
np.vstack()实现垂直拼接。
运行这段代码后,得到的结果就和你期望的目标数组完全一致了。
内容的提问来源于stack exchange,提问作者user18147555
相关产品推荐
相关产品推荐

