如何用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
相关产品推荐
相关产品推荐

