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

如何用Pandas DataFrame实现用户数据按月分组转宽表?含子集分组疑问

解决方案:Pandas实现长表转宽表(按用户行、月份列分组)

没问题,这个需求就是Pandas里很常见的长格式数据转宽格式操作,用pivot_table就能轻松搞定,我给你一步步演示具体实现:

1. 先构造原始测试数据

首先我们先把你给出的原始数据转换成Pandas DataFrame,方便后续操作:

import pandas as pd

# 你的原始数据
raw_data = {
    'month': ['January', 'January', 'December', 'January', 'December'],
    'userId': ['aabzhlxycj', 'aacuvynjwq', 'aabzhlxycj', 'aailjxciyk', 'aacuvynjwq'],
    'usage_count': [2, 1, 2, 2, 1],
    'userEmail': ['jakiyah@academy.com', 'jack@gmail.com', 'jakiyah@academy.com', 'maria@gmail.com', 'jack@gmail.com']
}
df = pd.DataFrame(raw_data)

2. 核心转换:用pivot_table实现行列转换

pivot_table是处理这类分组透视需求的利器,它能自动帮我们聚合数据、填充缺失值:

# 生成透视表
pivoted_df = df.pivot_table(
    index=['userId', 'userEmail'],  # 行:用户ID和邮箱
    columns='month',                # 列:月份
    values='usage_count',           # 填充的值:使用次数
    aggfunc='sum',                  # 聚合方式:如果同一用户同月有多条数据,求和
    fill_value=0                    # 缺失的月份填充0
).reset_index()  # 把索引列(userId、userEmail)转成普通列

3. 调整格式匹配需求

最后我们调整列的顺序,去掉多余的列名标识,让结果完全符合你要的格式:

# 指定列的顺序,和目标格式一致
desired_cols = ['userId', 'userEmail', 'January', 'December']
final_df = pivoted_df[desired_cols]

# 去掉columns的名称(默认会保留'month'作为列名的层级,这里不需要)
final_df.columns.name = None

最终结果

运行后final_df的输出就是你想要的格式:

userId             userEmail  January  December
0  aabzhlxycj  jakiyah@academy.com        2         2
1  aacuvynjwq       jack@gmail.com        1         1
2  aailjxciyk       maria@gmail.com        2         0

补充说明

  • 为什么用pivot_table而不是pivot?因为pivot要求index+columns的组合必须唯一,而pivot_table支持聚合重复数据,适用性更广(比如如果你的数据里同一个用户同一个月有多条使用记录,sum会自动计算总次数)。
  • 如果你的原始数据保证每个用户每个月只有一条记录,也可以用df.pivot(index=['userId','userEmail'], columns='month', values='usage_count').fillna(0).reset_index(),效果类似,但pivot_table更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:47:30