Pandas 索引转置函数stack(),unstack()详解

stack()及unstack()函数简介

stack()具有堆栈的意思,在pandas中,stack的作用在于通过转置索引来实现堆栈效果,stack()的作用为将列索引转到行索引进行堆栈,将已存在的行索引变为高维行索引,列索引为低维行索引。

unstack()则相反,是将列索引转为行索引,列索引变为低维行索引,原行索引变为高维行索引

注意,如果经过stack()或unstack()进行索引转置后,如果出现了其中一轴为空的情况,则DataFrame就变为了Series,对于Series对象来说,它是一个列方向的一维容器,所以也只有列索引,所以Series对象只能使用unstack()函数,通过将列索引变为行索引可以变为DataFrame

stack()及unstack()函数具有参数level,level的值默认为-1,含义为索引的下标,具象化来说,如果DataFrame的一个轴或Series中存在高维索引,比如索引有两个维度,则高维索引的下标为0,低维索引的下标为1,反之,我们也可以用反向索引,低维索引的下标为-1,高维索引的下标为-2

例一:普通dataframe使用stack()

import numpy as np
import pandas as pdnp.random.seed(1)col = pd.Index(data = list('ABCD'),name = '商品')
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')data = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = inde,columns=col)
print(data,end = '\n\n')print(data.stack(),end  = '\n\n')# 商品      A   B   C   D
# 销售                   
# tom    37  12  72   9
# jerry  75   5  79  64
# nancy  16   1  76  71
# 
# 销售     商品
# tom    A     37
#        B     12
#        C     72
#        D      9
# jerry  A     75
#        B      5
#        C     79
#        D     64
# nancy  A     16
#        B      1
#        C     76
#        D     71
# dtype: int32

例二:Series使用unstack()

这里我们通过stack函数将列索引转化为低维行索引,使data变为了一个Series对象,并且具有高维索引,这里我们可以使用unstack将列索引转为行索引,我们有两种选择,一种选销售,一种选商品,执行的方式为参数level的调用level参数默认为为-1,也就是低维索引商品

import numpy as np
import pandas as pdnp.random.seed(1)col = pd.Index(data = list('ABCD'),name = '商品')
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')data = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = inde,columns=col)
print(data,end = '\n\n')data=data.stack()
print(data,end  = '\n\n')print(data.unstack())#商品      A   B   C   D
#销售                   
#tom    37  12  72   9
#jerry  75   5  79  64
#nancy  16   1  76  71# 销售     商品
# tom    A     37
#        B     12
#        C     72
#        D      9
# jerry  A     75
#        B      5
#        C     79
#        D     64
# nancy  A     16
#        B      1
#        C     76
#        D     71
# dtype: int32
# 
# 商品      A   B   C   D
# 销售                   
# tom    37  12  72   9
# jerry  75   5  79  64
# nancy  16   1  76  71

这里若想要将销售变为行索引,只需要将level设置为0或者-2即可

import numpy as np
import pandas as pdnp.random.seed(1)col = pd.Index(data = list('ABCD'),name = '商品')
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')data = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = inde,columns=col)
print(data,end = '\n\n')data=data.stack()
print(data,end  = '\n\n')print(data.unstack(level=-2))# 商品      A   B   C   D
# 销售
# tom    37  12  72   9
# jerry  75   5  79  64
# nancy  16   1  76  71
#
# 销售     商品
# tom    A     37
#        B     12
#        C     72
#        D      9
# jerry  A     75
#        B      5
#        C     79
#        D     64
# nancy  A     16
#        B      1
#        C     76
#        D     71
# dtype: int32
#
# 销售  tom  jerry  nancy
# 商品
# A    37     75     16
# B    12      5      1
# C    72     79     76
# D     9     64     71

例三:具有高维索引的DataFrame使用stack()和unstack()

import numpy as np
import pandas as pdnp.random.seed(1)
multic = pd.MultiIndex.from_product([['星期一','星期二'],list('ABCD')],names = ['周期','商品'])
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')data = pd.DataFrame(data = np.random.randint(0,100,(3,8)),index=inde,columns=multic)
print(data,end='\n\n')data = data.stack(level=0)
print(data,end='\n\n')print(data.unstack(level = -2))# 周期    星期一             星期二            
# 商品      A   B   C   D   A   B   C   D
# 销售                                   
# tom    37  12  72   9  75   5  79  64
# jerry  16   1  76  71   6  25  50  20
# nancy  18  84  11  28  29  14  50  68
# 
# 商品          A   B   C   D
# 销售    周期                 
# tom   星期一  37  12  72   9
#       星期二  75   5  79  64
# jerry 星期一  16   1  76  71
#       星期二   6  25  50  20
# nancy 星期一  18  84  11  28
#       星期二  29  14  50  68
# 
# 商品      A               B               C               D          
# 销售  jerry nancy tom jerry nancy tom jerry nancy tom jerry nancy tom
# 周期                                                                 
# 星期一    16    18  37     1    84  12    76    11  72    71    28   9
# 星期二     6    29  75    25    14   5    50    50  79    20    68  64

在这个例子中,我们先后将行索引具有高维索引的DataFrame进行了stack()和unstack()操作,分别将高维列索引'周期'转为了低维行索引,然后又将高维行索引'销售'转为了低维列索引

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

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

相关文章

计算机网络29——Linux基本命令vim,gcc编译命令

1、创建新用户 2、给用户设置密码 3、切换到新用户 切换到root用户 4、删除用户 5、查看ip 6、ping 查看物理上两台主机是否联通 7、netstatus 8、nslookup 查看网址的地址 9、负载均衡与容灾备份 负载均衡:指将负载(工作任务)进行平衡、分…

STM32如何修改外部晶振频率和主频

对于STM32F10x系列的单片机,除了STM32F10x_CL单片机,其它的单片机一般外部晶振HSE的时钟频率都默认是8MHz。如果我们使用的外部晶振为12Mhz,那么可以把上图绿色标记改为:12000000 72MHz的主频8MHz的外部晶振HSE*倍频系数9。当然如果像上面把外…

什么是HTTP DDOS,如何防护

在当今高度互联的网络世界中,网络安全威胁日益严峻,其中HTTP DDoS(Distributed Denial of Service,分布式拒绝服务)攻击作为一种常见的网络攻击手段,给企业和个人用户带来了巨大的挑战。今天我们就来详细介…

STM32与51单片机的区别:是否应该直接学习STM32?

STM32与51单片机的区别:是否应该直接学习STM32? 在单片机的世界里,STM32和51单片机都是非常重要的角色。对于初学者来说,是否可以直接跳过51单片机,直接学习STM32,这个问题一直存在争议。让我们深入探讨这…

Linux 文件权限详解与管理

文章目录 前言一、文件权限概述1. 权限表示格式2. 权限组合值 二、查看文件权限三、修改文件所有者与所属组1. 使用 chown 修改文件所有者2. 使用 chgrp 修改文件所属组3. 添加所有者 四、修改文件权限1. 符号方式2. 八进制方式3. 实际修改 总结 前言 在 Linux 系统中&#xf…

2024 新手指南:轻松掌握 Win10 的录屏操作

之前为了节约成本我们公司都采用录制软件操作都方式来为异地的同事进行远程操作培训的。所以我们尝试了不少的录屏工具,这里我就分享下win10怎么录屏的操作过程。 1.福昕录屏大师 链接:www.foxitsoftware.cn/REC/ 这款录屏工具是初学者的理想之选&…

网关登录校验(2)----网关如何将用户信息传递给微服务

1.微服务获取用户信息 现在,网关已经可以完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时,微服务又该如何获取用户身份呢? 由于网关发送请求到微服务依然采用的是Http请求,因此我们可以将用户信息以请求头…

【linux】4张卡,坏了1张,怎么办?

先禁用这张卡 grub 禁用,防止加载驱动 禁用这张卡的 PCI # 禁用 PCI 设备 0000:b1:00.0 (NVIDIA GPU) ACTION"add", SUBSYSTEM"pci", ATTR{vendor}"0x10de", KERNELS"0000:b1:00.0", RUN"/bin/sh -c echo 0000:b1:00…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试:unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的,然后没改东西,点完应用Apply以后,就可以调试了...(不…

sqlite数据库设计工具

下载 开发环境 VS2022 + Qt5.14.2 CMake修改 add_subdirectory(sqlite3-cmake) include_directories(${CMAKE_SOURCE_DIR}/sqlite3-cmake/src) target_link_libraries(${PROJECT_NAME} sqlite3) 效果 参考 https://github.com/sqlitebrowser/sqlitebrowser

JavaWeb JavaScript 11.XML —— 配置文件

生活想埋没我,没想到我是颗种子 —— 24.9.19 一、XML 1.什么是XML XML是EXtensible Markup Languge的缩写,翻译过来就是可扩展标记语言。所以很明显,XML和HTML一样都是标记语言,也就是说它们的基本语法都是标签 可扩展 三个字…

AI健身体能测试之基于paddlehub实现引体向上计数个数统计

【引体向上计数】 本项目使用PaddleHub中的骨骼检测模型human_pose_estimation_resnet50_mpii,进行人体运动分析,实现对引体向上的自动计数。 1. 项目介绍 人体运动分析是近几年许多领域研究的热点问题。在学科的交叉研究上,人体运动分析涉…

《微软飞行模拟2024》储存空间需求仅不到前作的1/5

根据微软在最新一期 Xbox Wire 中的介绍,将于今年11 月登陆 Xbox Series X|S 主机的《微软飞行模拟2024》将比前作占用空间小很多。 微软解释了为何新作的文件大小仅为30GB,约为前作的五分之一。简单来说,微软使用了云流媒体传输技术。公司还…

macOS平台(intel)编译MAVSDK安卓平台SO库

1.下载MAVSDK: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译liblzma 修改CMakeLists.txt文件增加C与CXX指令-fPIC set(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-fPIC ${CMAKE_CXX_FLAGS}") 修改如下:…

谷粒商城のElasticsearch

文章目录 前言一、前置知识1、Elasticsearch 的结构2、倒排索引 (Inverted Index)2.1、 索引阶段2.2、查询阶段 二、环境准备1、安装Es2、安装Kibana3、安装 ik 分词器 三、项目整合1、引入依赖2、整合业务2.1、创建索引、文档、构建查询语句2.2、整合业务代码 后记 前言 本篇介…

一文读懂SpringCLoud

一、前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)… 所以,这篇主要来讲讲SpringCloud的一些基础的知识。(我就是现学现卖了,主要当做我学习SpringCloud的笔记吧&…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

携手鲲鹏,长亮科技加速银行核心系统升级

新经济周期下&#xff0c;银行净息差持续收窄、盈利压力加大、市场竞争日趋加剧。同时&#xff0c;国家相关政策不断出台&#xff0c;对金融科技的自主创新与安全可控提出了更高要求。 在这样的大背景下&#xff0c;银行业的数字化转型已经步入深水区。其中&#xff0c;核心系统…

1.5 计算机网络的分层结构

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 分层设计2 网络体系结构2.1 基本概述2.2 常见的三种网络体系结构 3 各层之间的关系3.1 水平关系3.2 垂直关系 4 数据传输过程4.1 水平视角4.2 垂直视角 前言 在当今数字…

契约锁与您相约2024新疆数字经济创新大会暨新疆数字丝路博览会

9月20日&#xff0c;由新疆数字经济联合会主办&#xff0c;多家行业协会及企业共同承办的“2024(第一届)新疆数字经济创新发展大会暨新疆数字丝路博览会”在新疆国际会展中心盛大开幕&#xff0c;活动期间&#xff0c;契约锁作为电子签章行业领先的服务商携数字可信系列产品亮相…