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

