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

Pandas中结合Groupby与Rolling生成矩阵的实现需求

Pandas分组滚动生成矩阵问题

我是Pandas新手,这个问题卡了两天,试了各种方法查资料都没解决。现有如下DataFrame:

import pandas as pd

df = pd.DataFrame({'a': [1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3],
                   'b': ['b1','b1','b1','b1','b1','b1','b1','b1','b1','b2','b2','b2','b2','b2','b2','b2','b2','b2',],
                   'c': ['c1','c2','c3','c1','c2','c3','c1','c2','c3','c1','c2','c3','c1','c2','c3','c1','c2','c3',],
                   'value': ['v1','v2','v3','v4','v5','v6','v7','v8','v9','v10','v11','v12','v13','v14','v15','v16','v17','v18']})
                   
print(df)

打印后的原始DataFrame:

a   b   c value
0   1  b1  c1    v1
1   1  b1  c2    v2
2   1  b1  c3    v3
3   2  b1  c1    v4
4   2  b1  c2    v5
5   2  b1  c3    v6
6   3  b1  c1    v7
7   3  b1  c2    v8
8   3  b1  c3    v9
9   1  b2  c1   v10
10  1  b2  c2   v11
11  1  b2  c3   v12
12  2  b2  c1   v13
13  2  b2  c2   v14
14  2  b2  c3   v15
15  3  b2  c1   v16
16  3  b2  c2   v17
17  3  b2  c3   v18

需求说明

按b字段分组,每个分组内对连续2个a进行滚动操作,生成以a(格式为a1/a2/a3)为行、c为列、value为单元格值的矩阵,预期输出如下:

c1 c2 c3
b1   a1   v1 v2 v3
     a2   v4 v5 v6 

b1   a2   v4 v5 v6
     a3   v7 v8 v9

b2   a1   v10 v11 v12
     a2   v13 v14 v15

b2   a2   v13 v14 v15
     a3   v16 v17 v18

解决方案

实现步骤

  • 先对原始数据做透视,将每个(b,a)组合对应的c列值整合为一行,方便后续滚动操作
  • 按b分组后,对每个分组内的行执行窗口大小为2的滚动遍历
  • 格式化输出每个滚动窗口对应的矩阵

代码实现

import pandas as pd

# 原始数据
df = pd.DataFrame({'a': [1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3],
                   'b': ['b1','b1','b1','b1','b1','b1','b1','b1','b1','b2','b2','b2','b2','b2','b2','b2','b2','b2',],
                   'c': ['c1','c2','c3','c1','c2','c3','c1','c2','c3','c1','c2','c3','c1','c2','c3','c1','c2','c3',],
                   'value': ['v1','v2','v3','v4','v5','v6','v7','v8','v9','v10','v11','v12','v13','v14','v15','v16','v17','v18']})

# 1. 透视数据:将(b,a)作为索引,c作为列,value作为值
pivot_df = df.pivot(index=['b', 'a'], columns='c', values='value').reset_index()
# 把a列格式化为a1、a2的形式
pivot_df['a'] = pivot_df['a'].apply(lambda x: f'a{x}')

# 2. 按b分组处理滚动窗口
for b_group, sub_df in pivot_df.groupby('b'):
    # 遍历每个连续2行的窗口
    for i in range(len(sub_df) - 1):
        # 提取当前窗口的行,设置a为索引并移除b列
        window_data = sub_df.iloc[i:i+2].set_index('a').drop('b', axis=1)
        # 输出分组标识和窗口矩阵
        print(f"{b_group}")
        print(window_data)
        print()

代码说明

  • pivot操作将分散的c列值整合到同一行,解决了原始数据中每个(b,a,c)对应单个value的问题
  • 按b分组后,通过遍历索引实现窗口大小为2的滚动,确保每个分组内只取连续的两个a组
  • 格式化a列为a1/a2样式,与预期输出一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:03:11