【Pandas】pandas DataFrame stack

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 的列索引“压入”行索引中,从而增加行数并减少列数的方法

pandas.DataFrame.stack()

pandas.DataFrame.stack(level=-1, dropna=<no_default>, sort=<no_default>, future_stack=False) 是一个用于将 DataFrame 的列索引“压入”行索引中,从而增加行数并减少列数的方法。它常用于将宽格式数据转换为长格式数据,是 unstack() 的反向操作。


📌 方法签名
DataFrame.stack(level=-1, dropna=True, sort=False, future_stack=False)

🔧 参数说明
参数类型说明
levelint、str 或 list of int/str,默认 -1(最后一级)要堆叠的列索引层级;默认只堆叠最内层
dropnabool,默认 True是否删除结果中的 NaN
sortbool,默认 False是否对新生成的 MultiIndex 进行排序
future_stackbool,默认 False控制是否启用未来行为(Pandas 2.0+ 中可能默认为 True)

✅ 返回值
  • 返回一个新的 DataFrameSeries
  • 如果堆叠后只剩一列,则返回 Series
  • 否则返回 DataFrame
  • 原始数据不会被修改。

🧪 示例代码及结果
示例 1:基本用法(单级列索引)
import pandas as pd# 创建一个普通 DataFrame
df = pd.DataFrame({'A': [1, 2],'B': [3, 4]
}, index=['row1', 'row2'])print("Original DataFrame:")
print(df)
输出:
      A  B
row1  1  3
row2  2  4
# stack() 将列变为行索引
stacked = df.stack()
print("\nAfter stack():")
print(stacked)
输出:
row1  A    1B    3
row2  A    2B    4
dtype: int64

结果是一个 Series,具有多级索引。


示例 2:使用 dropna=False 保留缺失值
df_with_nan = pd.DataFrame({'A': [1, None],'B': [None, 4]
}, index=['row1', 'row2'])print("DataFrame with NaN:")
print(df_with_nan)
输出:
       A    B
row1  1.0  NaN
row2  NaN  4.0
# 不删除 NaN
stacked_with_nan = df_with_nan.stack(dropna=False)
print("\nAfter stack(dropna=False):")
print(stacked_with_nan)
输出:
row1  A    1.0B    NaN
row2  A    NaNB    4.0
dtype: float64

示例 3:堆叠多级列索引(MultiIndex)
# 创建一个多级列索引 DataFrame
arrays = [['X', 'X', 'Y', 'Y'],['a', 'b', 'a', 'b']
]
columns = pd.MultiIndex.from_arrays(arrays, names=('group', 'sub'))
df_multi_col = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns=columns)print("Original Multi-column DataFrame:")
print(df_multi_col)
输出:
group          X         Y       
sub            a  b       a  b
0              1  2       3  4
1              5  6       7  8
# 默认堆叠最内层(sub)
stacked_inner = df_multi_col.stack()
print("\nAfter stack() (inner level):")
print(stacked_inner)
输出:
   group  X  Y
0 sub         a     X  1  3b     X  2  4
1 sub         a     X  5  7b     X  6  8

注意:此时返回的是 DataFrame,因为堆叠后仍有多列。


示例 4:指定堆叠外层索引(level=‘group’)
# 堆叠外层索引(group)
stacked_outer = df_multi_col.stack(level='group')
print("\nAfter stack(level='group'):")
print(stacked_outer)
输出:
sub           a  bgroup              
0 X           1  2Y           3  4
1 X           5  6Y           7  8

此时 group 被压入行索引中。


示例 5:堆叠多个层级(level=[0, 1])
# 堆叠所有层级
stacked_all_levels = df_multi_col.stack(level=[0, 1])
print("\nAfter stack(level=[0, 1]):")
print(stacked_all_levels)
输出:
   group  sub  value
0 X   a        1X   b        2Y   a        3Y   b        4
1 X   a        5X   b        6Y   a        7Y   b        8

注意:在某些版本中会自动添加 value 列名。


示例 6:设置 sort=True 对结果排序
# 设置 sort=True
stacked_sorted = df_multi_col.stack(sort=True)
print("\nAfter stack(sort=True):")
print(stacked_sorted)
输出(与前面类似,但索引已排序):
   group  X  Y
0 sub         a     X  1  3b     X  2  4
1 sub         a     X  5  7b     X  6  8

索引按字典序排列。


🧠 应用场景
场景说明
重塑数据结构将宽格式转为长格式,适合后续分析或绘图
准备时间序列数据如将不同时间点的数据合并为一列
配合 groupby 使用长格式更适合分组统计
可视化准备准备适合绘制箱线图、折线图等的数据格式

⚠️ 注意事项
  • stack() 默认只堆叠最内层列索引;
  • 可通过 level 指定任意层级;
  • dropna=True 会删除含 NaN 的行;
  • sort=True 会对新生成的 MultiIndex 排序;
  • 堆叠后如果只剩一列,结果为 Series
  • 适用于行索引(axis=0),不支持列方向堆叠;
  • future_stack=True 在 Pandas 2.0+ 中可能会成为默认行为。

✅ 总结对比
方法是否推荐使用说明
stack()✅ 推荐快速将列索引压入行索引
stack(level='name')✅ 推荐使用层级名清晰直观
stack(level=0)✅ 推荐快速按编号堆叠层级
stack(..., dropna=False)✅ 推荐保留缺失值
stack(..., sort=True)✅ 推荐自动排序索引

你可以根据实际需求选择堆叠哪些层级、是否删除缺失值、是否排序,从而灵活地将数据从“宽格式”转换为“长格式”,便于后续分析和可视化。它是 Pandas 中非常重要的数据重塑工具之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87317.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 自动关闭资源语法糖 - try-with-resources

文章目录 Java 自动关闭资源语法糖 - try-with-resources前言优势1、自动资源管理2、处理多重资源3、异常处理更健壮4、适用条件 总结 Java 自动关闭资源语法糖 - try-with-resources 前言 日常开发中&#xff0c;我们经常会看到如下代码&#xff1a; try (InputStream is …

MyBatis中的动态SQL是什么?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis中的动态SQL是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis中的动态SQL是什么&#xff1f; 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; MyBatis中的动态SQL指的是根据不同的条件&#x…

【Java反射】如何新增对象中的属性,与JavaScript中的直接添加属性有什么区别?

问&#xff1a; Object obj new Object(); //获取一个类的class对象 Class<?> objClass Object.class; try { //通过newInstance方法创建一个新的属性 Field newField Field.class.newInstance(); newField.setAccessible(true); newField.set(obj, “index”); }ca…

java spring boot Swagger安装及使用

https://springdoc.org/ 可能原因分析 &#x1f50d; 原因 1&#xff1a;SpringFox 版本与 Spring Boot 版本不兼容 ❌ SpringFox 3.0.0 不完全兼容 Spring Boot 2.6 及更高版本&#xff0c;可能导致 NullPointerException。 Spring Boot 3.x 完全不支持 SpringFox&#xff0c…

电商云仓/前置仓的物流高效监控、管理、预警系统,快递鸟DMS

在电商行业蓬勃发展的当下&#xff0c;电商云仓和前置仓作为物流配送体系的关键环节&#xff0c;其高效运作直接影响着消费者体验与企业竞争力。快递鸟 DMS 物流交付管理平台&#xff0c;以其卓越的物流监控、管理及预警功能&#xff0c;成为电商企业优化云仓和前置仓物流管理的…

HarmonyOS Next深度解析:高德定位SDK高效集成与实战指南

HarmoyOS Next 实现高德定位SDK 注&#xff1a;作者采用版本为 HarmonyOS 5.0.0 Release SDK和DevEco Studio 5.0.0 Release。 1.获取本地AppID&#xff1a; 在index.pages的abountToAppear( ) 方法中获取appID、并打印在Log日志&#xff0c;即可在程序运行时获取本地项目的…

【技术】记一次 Docker 中的 ES 数据迁移,使用 Reindex API

记一次 Docker 中的 ES 数据迁移&#xff0c;使用 Reindex API 环境背景需求背景开始迁移确认老 ES 的访问地址在新 ES 中创建索引的 Mapping (选配)在新 ES 中配置老 ES 的地址开始迁移数据数据验证 首先声明&#xff0c;是因为环境限制&#xff0c;没有办法使用同步工具&…

yii2基础版本安装记录,实录有点乱看标题即可

因为使用php 安装的是docker环境所有进入到容器安装ridh_mfe_api 为挂载目录 Nginx及PHP挂载配置 因为使用php 安装的是docker环境所有进入到容器安装 ridh_mfe_api 为挂载目录 进入容器 % docker exec -it php sh /var/www/html # ls index.html index.php composer crea…

前端跨域解决方案(3):CORS

1 CORS 核心 CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;即跨域资源共享&#xff0c;是目前最主流的跨域方案&#xff0c;它通过服务器返回的特殊 HTTP 头&#xff0c;允许浏览器放行跨域请求。与传统的 JSONP 相比&#xff0c;CORS 具有明显的优…

SpringBoot源码解析(十五):spring-boot-autoconfigure.jar的模块化设计

前言 SpringBoot的自动配置是其革命性特性的核心&#xff0c;而spring-boot-autoconfigure.jar则是这一机制的物理载体。本文将深入剖析这个JAR包的模块化设计哲学&#xff0c;从包结构划分、条件注解体系到自动配置加载机制&#xff0c;全方位解析SpringBoot如何通过精妙的模…

学习笔记九:docker容器日志问题

docker容器日志问题 背景如何处理日志问题主要通过日志轮询方式处理。修改 Docker 配置日志快速清理 背景 Docker 默认使用的是 json-file 日志驱动。日志会一直写&#xff0c;一直写&#xff0c;没有限制、没有轮转、没有清理&#xff01; 日志默认位置&#xff1a; /var/lib…

低成本同屏方案:电脑 + 路由器实现 50 台安卓平板实时同屏

引言 在教育机构、小型培训场景或企业简易会议中&#xff0c;常面临以最低成本实现多设备同屏的需求。本文针对 "电脑 路由器 50 台安卓平板" 的极简硬件组合&#xff0c;详细剖析实时同屏的实现路径&#xff0c;从问题分析到技术落地提供全流程解决方案&#xff0…

Unity ECS DOTS技术实现50000个cube随机循环移动流程

前言 之前使用过ECS面向组件开发&#xff0c;一直想试一下Unity的ECS DOTS技术&#xff0c;但是苦于入门门槛太高&#xff0c;下载官方的Demo&#xff0c;发现代码哪哪儿都看不懂&#xff0c;一大堆API闻所未闻&#xff0c;而且没有一个入门的流程&#xff0c;导致无法进行下去…

设计模式精讲 Day 3:抽象工厂模式(Abstract Factory Pattern)

【设计模式精讲 Day 3】抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 文章简述 在软件开发中&#xff0c;随着业务复杂度的提升&#xff0c;系统需要支持多种产品族的创建。抽象工厂模式正是为了解决这一问题而诞生的设计模式之一。本文作为“设计模式精讲”…

Kafka消息零丢失架构设计:从原理到实战的全方位保障

引言 在构建高可靠分布式系统时&#xff0c;Kafka作为核心消息中间件被广泛应用于数据管道、实时流处理等关键场景。然而&#xff0c;分布式环境下的网络波动、节点故障等因素可能导致消息丢失&#xff0c;如何确保Kafka实现端到端的消息零丢失成为架构设计的关键挑战。本文将…

Python学习笔记:错误和异常处理

1. 什么是错误和异常 在Python中&#xff0c;错误可以分为两类&#xff1a; 语法错误(Syntax Errors)&#xff1a;代码不符合Python语法规则异常(Exceptions)&#xff1a;语法正确的代码在运行时发生的错误 # 语法错误示例 print("Hello World" # 缺少右括号# 异…

为什么要进行行为验证,行为验证方式有哪些?

进行行为验证的主要目的是提高账户安全性、防范自动化攻击、增强用户身份确认精准度、优化用户体验。其中&#xff0c;提高账户安全性最为关键。行为验证能通过分析用户的行为模式&#xff0c;如操作习惯、设备使用特点等&#xff0c;识别出非正常或恶意活动&#xff0c;迅速采…

主流Java Redis客户端(Jedis、Lettuce、Redisson)差异对比

主流Java客户端对比&#xff1a;Jedis采用阻塞I/O&#xff0c;需连接池支持&#xff1b;Lettuce/Redisson基于Netty非阻塞I/O。Jedis轻量但并发能力弱&#xff0c;Lettuce支持10K并发且为SpringBoot默认&#xff0c;Redisson提供分布式功能但性能稍逊。 Redisson Lettuce 在 …

使用Hexo搭建博客网站(二)

设置主题 我们在官方主题中选择一个自己喜欢的主题 来到GitHub&#xff0c;将它git clone到当前项目的themes文件夹中 设置_config.yml 找到 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: landscape 只需将这个landscape名字…

springAI 大模型应用开发

一 笔记总结 1.1 spring AI 实战 1.1.1 spring aideepseek整合 通过使用spring ai 调用大模型deepseek&#xff0c;实现对话聊天&#xff0c;文字转图片&#xff0c;文字转音频。 1.1.2 OLLAMA Ollama 专为本地部署和运行大型语言模型&#xff08;LLM&#xff09;而设计的…