当前位置: 首页 > news >正文

【Pandas】pandas DataFrame unstack

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)

🔧 参数说明
参数类型说明
levelint、str 或 list of int/str,默认 -1(最后一级)要展开的行索引层级;默认只展开最内层
fill_valuescalar 或 None,默认 None替换结果中缺失值(NaN)的值
sortbool,默认 True是否对新生成的列索引进行排序

✅ 返回值
  • 返回一个新的 DataFrame
  • 原始数据不会被修改;
  • 如果原始数据是 Series,则返回 DataFrame
  • 如果原始数据是 DataFrame,则会增加列索引层级。

🧪 示例代码及结果
示例 1:基本用法(从 Series 展开为 DataFrame
import pandas as pd# 创建一个多级索引 Series(正确方式)
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
# unstack 最内层索引(inner)
unstacked = s.unstack()
print("\nAfter unstack():")
print(unstacked)
输出:
inner  one  two
outer          
A        1    2
B        3    4

示例 2:指定展开外层索引(level='outer'
# 展开 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 替换缺失值
# 创建一个不完整的多级索引 DataFrame
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
# 展开 inner 层索引,并填充 NaN 为 0
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 展开行索引为列索引
# 创建一个多级行索引 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
# 展开 inner 层索引
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=[...]
# 创建一个多级行索引和列索引的 DataFrame
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
# 展开 outer 和 inner 行索引中的 'outer'
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 中非常重要的数据重塑工具之一。

http://www.lryc.cn/news/571609.html

相关文章:

  • LVS+Keepalived高可用群集
  • 【请关注】真实案例pg及kong安装部署
  • CppCon 2017 学习:C++ in Academia
  • GNU Octave 基础教程(2):变量与数据类型详解(一)
  • 技术与情感交织的一生 (八)
  • Git中新创建分支是否为空?这可得视情况而定!
  • JVM-类加载机制
  • 论文笔记 <交通灯><多智能体>MetaLight:基于价值的元强化学习用于交通信号控制
  • 20.jsBridge多页面交互与原生事件监听冲突问题
  • 锂电池充电管理芯片XSP30 适用于2-3节串联锂电池升降压快速充电
  • 新发布的一款使用ReactNative新架构加载Svga动画的开源插件[android/ios]
  • 【解决方案】Java 11 报错 <javax.net.ssl.SSLException: Tag mismatch!>,Java 8 却没问题?
  • 二分K-means:让聚类更高效、更精准!
  • Alpine Docker 容器中安装包缓存与 C/C++ 运行问题
  • 2025年暑期在线实习项目分享
  • 专业音乐播放器分享,Foobar2000多格式解码的技术实现,界面自定义的实用技巧
  • [计算机网络] 网络的诞生:协议的认知建立
  • AndroidView的简单使用
  • 【第二章:机器学习与神经网络概述】01.聚类算法理论与实践-(3)DBSCAN 聚类算法
  • python学智能算法(十二)|机器学习朴素贝叶斯方法初步-拉普拉斯平滑计算条件概率
  • Java安全-常规漏洞问题(SQL注入,XXE,SSRF,RCE)
  • Linux系统移植10:uboot移植
  • Prompt+Agent+LLM:半导体炉管设备健康评估的落地实战
  • 开源 Arkts 鸿蒙应用 开发(三)Arkts语言的介绍
  • 腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(PostgreSQL版)
  • 字节跳动 AI 视频生成模型 Seedance 1.0 悄然超越 Google Veo 3
  • 经典风格的免费wordpress模板
  • 【世纪龙科技】3D 赋能教育革新,解锁新能源汽车结构教学新范式
  • MCU LTE Cat.1 bis 8910DM + SD NAND MKDV4GIL-AST:赋能 T-Box 的智能存储通信一体化解决方案
  • java设计模式[4]之设计型模式