如何对Pandas DataFrame同时执行透视(pivot)和堆叠(stack)操作
Pandas 时间列透视+分组堆叠实现方法
核心实现代码
你只需要通过索引调整+行列转换的组合操作,即可一次性满足所有需求,完整可运行代码如下:
首先导入依赖、构造示例数据:
import pandas as pd # 示例数据构造 data = [ [2018, "Alex", 172, 61], [2019, "Alex", 173, 62], [2020, "Alex", 173, 63], [2018, "Bill", 168, 59], [2019, "Bill", 168, 59], [2020, "Bill", 169, 60], [2018, "Cody", 193, 67], [2019, "Cody", 194, 69], [2020, "Cody", 194, 68], ] df = pd.DataFrame(data, columns=["year", "name", "height", "weight"])
执行转换操作:
# 1. 将分组列name、透视列year设为多级行索引 # 2. 把year从行索引转为列,实现水平透视,默认按年份升序排列 # 3. 把height、weight指标从列转为二级行索引,实现按name分组堆叠 result = df.set_index(['name', 'year']).unstack('year').stack(level=0)
输出效果验证
转换后的result结构完全符合要求,展示如下:
year 2018 2019 2020 name Alex height 172 173 173 weight 61 62 63 Bill height 168 168 169 weight 59 59 60 Cody height 193 194 194 weight 67 69 68
注:你给出的预期示例中Cody的2020年数值存在笔误,以上为正确计算结果。
需求匹配说明
- 按年份水平透视:
unstack('year')直接将所有年份取值展开为横向列 - 年份自动升序:pandas的行列转换操作默认按索引值升序排列,无需额外排序
- 按name分组堆叠其余列:最终行索引第一级为name,第二级为height/weight,自动实现分组堆叠效果。如果在Jupyter等可视化环境中查看,相同name的单元格会自动合并,完全匹配你给出的示例展示效果。
内容的提问来源于stack exchange,提问作者Khun Spoonzi
相关产品推荐
相关产品推荐

