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

pandas groupby分组后仅转置特定列的实现方法

问题背景

我知晓Stack Overflow平台上已有大量同类问题,但查阅大量相关解答后仍未找到适配自身需求的解决方案。

测试数据集

构造测试数据集的代码如下:

import pandas as pd
df = pd.DataFrame({
    'ID': ['1', '2', '3', '4','5','6','7'],
    'Manager': ["James","James","James", "Jason", "Kirk", "Lars", "Lars"],
    'weekno': [25, 25,25,25,25,25,25],
    'monthno': [6, 6,6,6,6,6,6]
})

需求说明

按月份、周维度分组生成类透视表结构:

  • 行维度:经理姓名
  • 统计值:对应经理名下的ID计数(ID为唯一设备标识,即统计不同经理管辖的设备总数量)

现有代码及问题

当前已实现基础分组计数的代码如下:

df = df.groupby(['monthno','weekno','Manager']).agg({'ID':'count'})

该代码能完成基础分组计数,但无法实现仅将monthno、weekno两列转置为列维度的效果;如果直接在代码末尾追加.T方法,会默认转置全部字段,把经理维度也转到列上,不符合预期。

期望效果

已在Excel中制作期望输出样例(样例数值为随机模拟值),效果为多层列头:第一层是月份、第二层是周,行头为经理姓名,单元格值为对应统计的ID数量。

实现方案

不要直接对全量分组结果做转置,分组后通过unstack指定要转到列的层级即可,或者直接用pivot_table实现,两种方法都可以:

# 方法1:基于现有分组代码调整,指定unstack的层级为月份、周,保留Manager在行维度
result = df.groupby(['Manager', 'monthno', 'weekno'])['ID'].count().unstack(level=['monthno', 'weekno'])
# 空值填0,转成整数格式
result = result.fillna(0).astype(int)

# 方法2:直接用透视表函数,逻辑更直观
result = pd.pivot_table(
    df,
    index='Manager',
    columns=['monthno', 'weekno'],
    values='ID',
    aggfunc='count',
    fill_value=0
)

用提供的测试集运行后输出结果如下:

Manager6月-25周
James3
Jason1
Kirk1
Lars2

如果后续数据存在多个月份、多个周的情况,列头会自动按「月份-周」的多层级展开,完全匹配需要的透视表结构,不会出现全量转置的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:27:17