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

如何调整Pandas透视表列顺序,实现周数据降序排列

如何让DataFrame透视表的周维度按降序排列?

现有数据集如下:

user_id, login_date, num_events, login_week
101, 2022-09-07, 1, Week 36
101, 2022-09-06, 4, Week 36
101, 2022-08-31, 1, Week 35
102, 2022-08-26, 1, Week 34
102, 2022-08-27, 7, Week 34
102, 2022-09-07, 1, Week 36

当前使用以下代码生成透视表:

df = df.groupby(['login_week', 'user_id'])['num_events'].agg('sum').reset_index()
df = df.pivot(index=['user_id'], columns='login_week', values='num_events').reset_index()

得到的结果是周维度按升序排列:

user_id, Week 34, Week 35, Week 36
101, 0, 1, 5
102, 8, 0, 1

希望得到周维度按降序排列的结果(最新周在前):

user_id, Week 36, Week 35, Week 34
101, 5, 1, 0
102, 1, 0, 8

解决方案

方法1:透视后调整列顺序

提取login_week中的数字部分,按数字降序排序后重新排列列:

# 生成透视表
df = df.groupby(['login_week', 'user_id'])['num_events'].sum().reset_index()
df_pivot = df.pivot(index=['user_id'], columns='login_week', values='num_events').reset_index()

# 提取周数并按降序排序列
sorted_weeks = sorted(df_pivot.columns[1:], key=lambda x: int(x.split(' ')[1]), reverse=True)
df_pivot = df_pivot[['user_id'] + sorted_weeks].fillna(0)

方法2:分组前先对周维度降序排序

利用groupby保留分组键顺序的特性,先按login_week的数字降序排序,再分组透视:

# 提取周数字并排序
df['week_num'] = df['login_week'].str.extract('(\d+)').astype(int)
df = df.sort_values('week_num', ascending=False).drop('week_num', axis=1)

# 分组透视
df = df.groupby(['login_week', 'user_id'])['num_events'].sum().reset_index()
df_pivot = df.pivot(index=['user_id'], columns='login_week', values='num_events').reset_index().fillna(0)

方法3:使用pivot_table简化操作

直接用pivot_table生成透视表,再调整列顺序:

df_pivot = df.pivot_table(index='user_id', columns='login_week', values='num_events', aggfunc='sum', fill_value=0).reset_index()
sorted_weeks = sorted(df_pivot.columns[1:], key=lambda x: int(x.split()[1]), reverse=True)
df_pivot = df_pivot[['user_id'] + sorted_weeks]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:40:39