如何用Pandas将DataFrame重塑为日期作为顶层列的子列结构?
解决DataFrame列层级重塑问题
问题原因
你之前的代码存在两个关键问题:
- 调用方式错误:需使用
df.pivot()方法,而非直接df(index=...)的写法 - 默认列层级顺序不符合需求:
pivot默认将品类(groceries/entertainment)设为顶层列,日期作为子列,和你想要的结构相反
正确实现步骤
1. 无重复数据场景
如果personName与Date的组合没有重复记录,直接用pivot后交换列层级即可:
# 正确调用pivot方法生成透视表 pivoted = df.pivot(index='personName', columns='Date', values=['groceries', 'entertainment']) # 交换列层级,将Date移至顶层,品类作为子列并排序 pivoted = pivoted.swaplevel(axis=1).sort_index(axis=1)
2. 有重复数据场景
如果同一用户同一天存在多条消费记录,改用pivot_table并指定聚合函数(如求和):
pivoted = df.pivot_table( index='personName', columns='Date', values=['groceries', 'entertainment'], aggfunc='sum' # 可根据需求替换为mean、max等 ) # 同样交换层级并排序 pivoted = pivoted.swaplevel(axis=1).sort_index(axis=1)
效果示例
假设原始数据为:
| personName | Date | groceries | entertainment |
|---|---|---|---|
| Alice | 2024-01-01 | 50 | 30 |
| Bob | 2024-01-01 | 40 | 25 |
| Alice | 2024-01-02 | 60 | 40 |
执行代码后,输出的列结构会是:
Date 2024-01-01 2024-01-02 groceries entertainment groceries entertainment personName Alice 50 30 60 40 Bob 40 25 NaN NaN
(若需将空值填充为0,可追加pivoted = pivoted.fillna(0))
内容的提问来源于stack exchange,提问作者Novice Python charmer
相关产品推荐
相关产品推荐

