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 )
用提供的测试集运行后输出结果如下:
| Manager | 6月-25周 |
|---|---|
| James | 3 |
| Jason | 1 |
| Kirk | 1 |
| Lars | 2 |
如果后续数据存在多个月份、多个周的情况,列头会自动按「月份-周」的多层级展开,完全匹配需要的透视表结构,不会出现全量转置的问题。
内容的提问来源于stack exchange,提问作者segababa
相关产品推荐
相关产品推荐

