Pandas stack()和unstack()的用法(附带实例)
在使用 Pandas 处理数据的过程中,有时需要对数据进行行列转换或重排,可以借助 stack() 和 unstack() 方法实现。

图 1 stack() 方法转换效果
stack() 方法的语法格式如下:
【实例 1】对英语成绩表进行行列转换,程序代码如下:
转换效果如下图所示:

图 2 unstack() 方法转换效果
unstack() 方法的语法格式如下:
【实例 2】使用 unstack() 方法转换学生成绩表。同上例,转换学生成绩表,主要代码如下:
Pandas stack()方法
stack() 方法用于将原来的列索引转换成最内层的行索引,转换效果如下图所示:
图 1 stack() 方法转换效果
stack() 方法的语法格式如下:
DataFrame.stack(level=-1, dropna=True)参数说明:
- level:索引层级,定义为一个索引或标签,也可能是索引或标签列表,默认值是 -1;
- dropna:布尔型,默认值为 True;
- 返回值:DataFrame 对象或 Series 对象。
【实例 1】对英语成绩表进行行列转换,程序代码如下:
# 导入pandas模块 import pandas as pd # 解决数据输出时列名不对齐的问题 pd.set_option('display.unicode.east_asian_width', True) df = pd.read_excel('../datas/grade.xlsx') # 读取Excel文件 df = df.set_index(['班级', '序号']) # 设置2级索引“班级”和“序号” df = df.stack() # 行列转换 print(df)
Pandas unstack()方法
unstack() 方法与 stack() 方法相反,它是 stack() 方法的逆操作,即将最内层的行索引转换成列索引:转换效果如下图所示:

图 2 unstack() 方法转换效果
unstack() 方法的语法格式如下:
DataFrame.unstack(level=-1, fill_value=None)参数说明:
- level:索引层级,定义为一个索引或标签,也可能是索引或标签列表,默认值是 -1;
- fill_value:整型、字符串或字典,如果 unstack() 方法产生缺失值,则用该值替换 NaN 值。
【实例 2】使用 unstack() 方法转换学生成绩表。同上例,转换学生成绩表,主要代码如下:
df = pd.read_excel(io='../datas/grade.xlsx', sheet_name='英语2') # 读取Excel文件 df = df.set_index(['班级', '序号', 'Unnamed: 2']) # 设置多级索引 print(df.unstack()) # 数据转换unstack() 方法中有一个参数可以指定转换第几层索引,例如,unstack(0) 表示把第一层行索引转换为列索引,默认是将最内层行索引转换为列索引。