如何转置按Date分组的DataFrame数据?
重塑DataFrame:将多层行索引转置为列
原始DataFrame结构
Date Name 01-2021 Mark 714.53 Chris 112681.49 Ashley 3127.07 Brad 16875.00 Michelle 429520.04 ... 12-2021 Mark 429520.04 Chris 975261.29 Ashley 377449.79 Brad 53391.73 Michelle 4286.00
目标格式
Name 01-2021 12-2021 Mark 714.53 429520.04 Chris 112681.49 975261.29 Ashley 3127.07 377449.79 Brad 16875.00 53391.73 Michelle 429520.04 4286.00
解决方案
用Pandas的unstack()方法可快速实现转换,步骤如下:
- 设置数值列名:如果原始DataFrame的数值列未命名,先给它指定列名(比如
Value):
df.columns = ['Value']
- 转置索引层级:将
Date层级的行索引转换为列索引:
# 把Date从行索引转为列,Name保留为行索引 transposed_df = df.unstack(level='Date')
- 清理列名结构:移除自动生成的列层级,只保留日期作为列名:
transposed_df.columns = transposed_df.columns.get_level_values(1)
- 调整索引为普通列:将
Name从行索引转为第一列,同时清除多余的轴标签:
transposed_df = transposed_df.reset_index().rename_axis(None, axis=1)
完整示例代码
import pandas as pd # 模拟原始DataFrame数据 data = [ ('01-2021', 'Mark', 714.53), ('01-2021', 'Chris', 112681.49), ('01-2021', 'Ashley', 3127.07), ('01-2021', 'Brad', 16875.00), ('01-2021', 'Michelle', 429520.04), ('12-2021', 'Mark', 429520.04), ('12-2021', 'Chris', 975261.29), ('12-2021', 'Ashley', 377449.79), ('12-2021', 'Brad', 53391.73), ('12-2021', 'Michelle', 4286.00) ] df = pd.DataFrame(data, columns=['Date', 'Name', 'Value']).set_index(['Date', 'Name']) # 执行转置操作 transposed_df = df.unstack(level='Date') transposed_df.columns = transposed_df.columns.get_level_values(1) transposed_df = transposed_df.reset_index().rename_axis(None, axis=1) print(transposed_df)
运行代码后输出的结果与目标格式完全一致。
内容的提问来源于stack exchange,提问作者Samir112
相关产品推荐
相关产品推荐

