Pandas中stack()与unstack()的使用场景、作用及常见问题咨询
Pandas stack()与unstack()问题解答
核心作用与适用场景
两个方法本质都是操作多层索引的层级位移,实现长表和宽表的互转:
stack():将列索引的指定层级移到行索引的最内层,作用是把宽表「压」成长表。适合需要把多列同类型指标合并为单列做聚合计算、或者数据需要适配seaborn等绘图库的长表输入要求的场景。unstack():将行索引的指定层级移到列索引的最内层,作用是把长表「拉」成宽表。适合需要把行内分类维度展开为列做交叉对比、或者构造交叉表结构的场景。
你提到的「pivot会将DataFrame转换为unstack的形式」的认知是正确的,pivot()的底层逻辑就是先将指定列设为行、列索引,再执行unstack操作,最终输出的结构和unstack后的宽表完全一致。
报错原因说明
你执行data.stack(level=1)报错的根本原因是:初始状态下的data只有1层列索引,而stack的level参数是按从0开始的顺序对应列索引的层级,level=1对应第2层列索引,不存在所以抛出层级不匹配的错误。
当你先执行data.unstack()时,会把原data的所有行索引层级全部移到列索引的内层,此时新的DataFrame列索引就变成了2层(原行索引层 + 原列索引层),存在level=1的层级,后续再执行stack(level=1)自然可以正常运行。
level=-1参数含义
pandas中所有涉及多层索引的level参数都支持负数值,规则是从最内层开始倒序计数:level=-1就代表最内层的索引,不管当前索引总共有几层,-1永远指向最靠内的层级。
这个参数值适合不需要明确知道索引总层数、只需要操作最内层的场景,尤其是索引层级是动态生成的场景下,用level=-1比写死固定层级数字的兼容性更强。
内容的提问来源于stack exchange,提问作者Medo Abdin
相关产品推荐
相关产品推荐

