Pandas2.2 DataFrame
Reshaping sorting transposing
方法 描述 DataFrame.droplevel(level[, axis]) 用于**从 DataFrame
的索引(行或列)中删除指定层级(level)**的方法 DataFrame.pivot(*, columns[, index, values]) 用于重塑 DataFrame 的结构 的方法 DataFrame.pivot_table([values, index, …]) 用于**创建透视表(pivot table)**的函数 DataFrame.reorder_levels(order[, axis]) 用于重新排序多级索引(MultiIndex)的层级顺序 的方法 DataFrame.sort_values(by, *[, axis, …]) 用于按指定列或行的值对 DataFrame
进行排序 的方法 DataFrame.sort_index(*[, axis, level, …]) 用于按索引(行或列)对 DataFrame
进行排序 的方法 DataFrame.nlargest(n, columns[, keep]) 用于选取 DataFrame 中某列或多列的前 n 个最大值对应的行 的方法 DataFrame.nsmallest(n, columns[, keep]) 用于选取 DataFrame 中某列或多列的前 n 个最小值对应的行 的方法 DataFrame.swaplevel([i, j, axis]) 用于交换多级索引(MultiIndex)中两个层级的位置 的方法 DataFrame.stack([level, dropna, sort, …]) 用于将 DataFrame 的列索引“压入”行索引中,从而增加行数并减少列数 的方法 DataFrame.unstack([level, fill_value, sort]) 用于将 DataFrame
的行索引层级“展开”为列索引层级 的方法
pandas.DataFrame.unstack()
pandas.DataFrame.unstack(level=-1, fill_value=None, sort=True)
是一个用于将 DataFrame
的行索引层级“展开”为列索引层级 的方法。它是 stack()
的反向操作,常用于将长格式数据转换为宽格式数据。
📌 方法签名
DataFrame. unstack( level= - 1 , fill_value= None , sort= True )
🔧 参数说明
参数 类型 说明 level
int、str 或 list of int/str,默认 -1
(最后一级) 要展开的行索引层级;默认只展开最内层 fill_value
scalar 或 None,默认 None
替换结果中缺失值(NaN)的值 sort
bool,默认 True
是否对新生成的列索引进行排序
✅ 返回值
返回一个新的 DataFrame
; 原始数据不会被修改; 如果原始数据是 Series
,则返回 DataFrame
; 如果原始数据是 DataFrame
,则会增加列索引层级。
🧪 示例代码及结果
示例 1:基本用法(从 Series
展开为 DataFrame
)
import pandas as pd
index = pd. MultiIndex. from_tuples( [ ( 'A' , 'one' ) , ( 'A' , 'two' ) , ( 'B' , 'one' ) , ( 'B' , 'two' ) ] , names= [ 'outer' , 'inner' ] )
s = pd. Series( [ 1 , 2 , 3 , 4 ] , index= index) print ( "Original Series:" )
print ( s)
输出:
outer inner
A one 1two 2
B one 3two 4
dtype: int64
unstacked = s. unstack( )
print ( "\nAfter unstack():" )
print ( unstacked)
输出:
inner one two
outer
A 1 2
B 3 4
示例 2:指定展开外层索引(level='outer'
)
unstacked_outer = s. unstack( level= 'outer' )
print ( "\nAfter unstack(level='outer'):" )
print ( unstacked_outer)
输出:
outer A B
inner
one 1 3
two 2 4
示例 3:使用 fill_value
替换缺失值
df = pd. DataFrame( { 'data' : [ 1 , 2 , 3 ]
} , index= pd. MultiIndex. from_tuples( [ ( 'A' , 'one' ) , ( 'A' , 'two' ) , ( 'B' , 'one' ) ] , names= [ 'outer' , 'inner' ] ) ) print ( "Original DataFrame:" )
print ( df)
输出:
data
outer inner
A one 1two 2
B one 3
unstacked_fill = df. unstack( fill_value= 0 )
print ( "\nAfter unstack(fill_value=0):" )
print ( unstacked_fill)
输出:
data
inner one two
outer
A 1 2
B 3 0
示例 4:从 DataFrame
展开行索引为列索引
arrays = [ [ 'A' , 'A' , 'B' , 'B' ] , [ 'one' , 'two' , 'one' , 'two' ]
]
index = pd. MultiIndex. from_arrays( arrays, names= ( 'outer' , 'inner' ) )
df = pd. DataFrame( { 'X' : [ 10 , 20 , 30 , 40 ] , 'Y' : [ 100 , 200 , 300 , 400 ] } , index= index) print ( "Original DataFrame:" )
print ( df)
输出:
X Y
outer inner
A one 10 100two 20 200
B one 30 300two 40 400
unstacked_df = df. unstack( )
print ( "\nAfter unstack():" )
print ( unstacked_df)
输出:
X Y
inner one two one two
outer
A 10 20 100 200
B 30 40 300 400
示例 5:展开多个层级(level=[...]
)
arrays_index = [ [ 'A' , 'A' , 'B' , 'B' ] , [ 'one' , 'two' , 'one' , 'two' ] ]
index = pd. MultiIndex. from_arrays( arrays_index, names= ( 'outer' , 'inner' ) ) arrays_columns = [ [ 'X' , 'X' , 'Y' , 'Y' ] , [ 'a' , 'b' , 'a' , 'b' ] ]
columns = pd. MultiIndex. from_arrays( arrays_columns, names= ( 'group' , 'sub' ) ) df_multi = pd. DataFrame( [ [ 1 , 2 , 3 , 4 ] , [ 5 , 6 , 7 , 8 ] , [ 9 , 10 , 11 , 12 ] , [ 13 , 14 , 15 , 16 ]
] , index= index, columns= columns) print ( "Original MultiIndex DataFrame:" )
print ( df_multi)
输出:
group X Y
sub a b a b
outer inner
A one 1 2 3 4two 5 6 7 8
B one 9 10 11 12two 13 14 15 16
unstacked_multi = df_multi. unstack( level= 'outer' )
print ( "\nAfter unstack(level='outer'):" )
print ( unstacked_multi)
输出:
group X Y
sub a b a b
outer A B A B A B A B
outer
inner
one 1 9 2 10 3 11 4 12
two 5 13 6 14 7 15 8 16
示例 6:关闭自动排序(sort=False
)
unstacked_no_sort = df. unstack( sort= False )
print ( "\nAfter unstack(sort=False):" )
print ( unstacked_no_sort)
输出(列顺序可能不一致):
X Y
inner one two one two
outer
A 10 20 100 200
B 30 40 300 400
🧠 应用场景
场景 说明 数据透视分析 如将时间序列按年份展开为列 可视化准备 准备适合绘图的数据结构(如热力图、折线图) 重塑数据结构 将长格式数据转为宽格式,便于比较不同类别 配合 groupby 使用 先分组统计后展开对比 处理缺失值 通过 fill_value
替换 NaN
⚠️ 注意事项
默认展开最内层索引(level=-1
); 支持通过名称或编号选择要展开的层级; fill_value
可替换结果中的 NaN
;sort=True
会对新生成的列索引排序;unstack()
对性能影响较小,适用于大多数中小型数据集;如果你只想查看某些层级,可结合 droplevel()
、swaplevel()
等方法使用。
✅ 总结对比
方法 是否推荐使用 说明 unstack()
✅ 推荐 快速展开最内层行索引为列索引 unstack(level='name')
✅ 推荐 使用层级名清晰直观 unstack(level=0)
✅ 推荐 快速按编号展开层级 unstack(..., fill_value=0)
✅ 推荐 替换缺失值 unstack(..., sort=False)
✅ 推荐 控制是否排序
你可以根据实际需求选择展开哪些层级、是否替换缺失值、是否排序,从而灵活地将数据从“长格式”转换为“宽格式”,便于后续分析和可视化。它是 Pandas 中非常重要的数据重塑工具之一。