Python之数据重塑——【stack()方法和unstack()方法、pivot()方法】

文章目录

  • 重塑层次化索引
    • 对于单层索引的DataFrame类对象
      • stack()方法
      • unstack()方法
    • 对于多层索引的DataFrame类对象
      • 辨析操作内层索引与外层索引的区别
      • 查看多层索引对象转换后的类型
  • 轴向旋转——pivot()方法


重塑层次化索引

Pandas中重塑层次化索引的操作主要是stack()方法和unstack()方法,前者是将数据的列“旋转”成行,后者是将数据的行“旋转”成列。

stack(self, level=-1, dropna=True)

上述方法中部分参数表示的含义如下:

  1. level:表示操作内层索引。若设为0,表示操作外层索引,默认为-1
  2. dropna:表示是否将旋转后的缺失值删除,若设为True,则表示自动过滤缺失值,设置False则相反

unstack(self, level=-1, fill_value=None)

上述方法中部分参数表示的含义如下:

  1. level:表示操作内层索引。若设为0,表示操作外层索引,默认为-1
  2. fill_value:若产生了缺失值,则可以设置这个参数用来替换NaN

对于单层索引的DataFrame类对象

stack()方法

测试对象:

df1:A   B
a  A0  B0
b  A1  B1

代码:

import numpy as npdf1 = pd.DataFrame({'A': ['A0', 'A1'],'B': ['B0', 'B1']},index=['a', 'b'])
df2 = pd.DataFrame(np.arange(8).reshape(2, 4),columns=[['A', 'A', 'B', 'B'],['A0', 'A1', 'B0', 'B1']])
result = df1.stack()
print("df1.stack():\n", result)

输出结果:

df1.stack():a  A    A0B    B0
b  A    A1B    B1
dtype: object

从输出结果看出,result对象具有两层行索引。

具有两层行索引而不再具有列索引的对象到底是DataFrame对象还是Series对象呢?

我们使用type()函数来查看result的类型,与df1做对比

type(df1):<class 'pandas.core.frame.DataFrame'>
type(result):<class 'pandas.core.series.Series'>

从输出结果可以看出,DataFrame对象已经被转换成了一个Series对象。


unstack()方法

尝试将result对象重塑成df1,先将result.unstack()的结果保存在ans对象里

代码:

ans = result.unstack()
print("ans:\n", ans)

输出结果:

ans:A   B
a  A0  B0
b  A1  B1

使用type()函数查看ans的类型,然后将其与df1作比较

代码:

print("type(ans):\n", type(ans))
print("ans == df1?", ans == df1)

输出结果:

type(ans):<class 'pandas.core.frame.DataFrame'>
ans == df1?A     B
a  True  True
b  True  True

由上可知,unstack()方法是stack()方法的逆操作,可以将重塑的Series对象“恢复原样”,转变成原来的DataFrame对象。


对于多层索引的DataFrame类对象

测试对象:

df2:A     B   A0 A1 A0 A1
0  0  1  2  3
1  4  5  6  7

辨析操作内层索引与外层索引的区别

代码:

df2 = pd.DataFrame(np.arange(8).reshape(2, 4),columns=[['A', 'A', 'B', 'B'],['A0', 'A1', 'A0', 'A1']])
result1 = df2.stack()  # 操作内层索引
result2 = df2.stack(level=0)  # 操作外层索引
print("df2.stack():\n", result1)
print("df2.stack(level=0):\n", result2)

输出结果:

df2.stack():A  B
0 A0  0  2A1  1  3
1 A0  4  6A1  5  7
df2.stack(level=0):A0  A1
0 A   0   1B   2   3
1 A   4   5B   6   7

查看多层索引对象转换后的类型

代码:

print("type(result1):\n", type(result1))
print("type(result2):\n", type(result2))

输出结果:

type(result1):<class 'pandas.core.frame.DataFrame'>
type(result2):<class 'pandas.core.frame.DataFrame'>

对于多层索引来讲,即使将外层行(列)索引或者内层行()列索引转换为列(行)索引,也不过是多层变单层,只要行和列两个方向仍然同时至少有单层索引存在,DataFrmae对象转换后就仍为DataFrame对象。


轴向旋转——pivot()方法

pivot()会根据给定的行索引或列索引重新组织一个DataFrame对象

pivot(self, index=None, columns=None, values=None)

上述方法中部分参数表示的含义如下:

  1. index:用于创建新DataFrame对象的行索引 。如果未设置,则使用原DataFrame对象的索引。
  2. columns:用于创建新DataFrame对象的列索引 。如果未设置,则使用原DataFrame对象的索引。
  3. values:用于填充新DataFrame对象中的值。

代码:

df3 = pd.DataFrame({'A': ['A0', 'A0', 'A1', 'A1'],'B': ['B0', 'B1', 'B0', 'B1'],'C': ['C0', 'C1', 'C2', 'C3']})
print("df3:\n", df3)
print("df3.pivot(index='A', columns='B', values='C'):\n", 
df3.pivot(index='A', columns='B', values='C'))

输出结果:

df3:A   B   C
0  A0  B0  C0
1  A0  B1  C1
2  A1  B0  C2
3  A1  B1  C3
df3.pivot(index='A', columns='B', values='C'):B   B0  B1
A         
A0  C0  C1
A1  C2  C3

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

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

相关文章

超硬核!学霸把操作系统经典算法给敲完了!要知行合一

上期的笔记&#xff0c;浏览快1万了&#xff0c;既然关注的人很多&#xff0c;那就发出来承诺过的算法全模拟&#xff0c;希望帮到你们。 上期的操作系统学霸笔记&#xff0c;考试复习面试全靠它 一、模拟进程调度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之数据转换——【rename()方法、cut()函数、get_dummies()函数】

文章目录重命名轴索引离散化连续数据哑变量处理类别型数据重命名轴索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!数据结构学霸笔记,考试面试吹牛就靠它

上次发操作系统笔记&#xff0c;很快浏览上万&#xff0c;这次数据结构比上次硬核的多哦&#xff0c;同样的会发超硬核代码&#xff0c;关注吧。 超硬核&#xff01;操作系统学霸笔记&#xff0c;考试复习面试全靠它 第一次笔记&#xff08;复习c&#xff0c;课程概述&#xff…

Python之数据拆分——groupby()方法

文章目录groupby()方法通过列名进行分组通过Series对象进行分组Series对象与原数据的行索引长度相等Series对象与原数据的行索引长度不等通过字典进行分组按照columns轴的方向进行分组按照index轴的方向进行分组通过函数进行分组groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白读了这篇文章,就能在算法圈混了

作为一只超级硬核的兔子&#xff0c;从来不给你说废话&#xff0c;只有最有用的干货&#xff01;这些神级算法送给你 目录 第一节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 …

Python之数据聚合——aggregate()方法

文章目录使用内置统计方法聚合数据面向列的聚合方法aggregate()方法对每一列数据应用同一个函数对某列数据应用不同的函数对不同列数据应用不同函数使用内置统计方法聚合数据 实现数据拆分成组并分别计算平均数的操作 代码&#xff1a; import pandas as pd import numpy as…

超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的

本文代码实现基本按照《数据结构》课本目录顺序&#xff0c;外加大量的复杂算法实现&#xff0c;一篇文章足够。能换你一个收藏了吧&#xff1f; 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟…

Python之分组级运算——【transform()方法、apply()方法】

文章目录数据转换——transform()方法数据应用——apply()方法数据转换——transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述&#xff0c;我们知道aggregate()方法返回的数据集的形状&#xff08;shape&#xff09;与被分组的数据集的形状是不同的…

java限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中&#xff0c;出于安全性考虑&#xff0c;经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是&#xff1a; 1、在同一台电脑上一次只允许有一个用户登录系统&#xff1b; 2、一个用户在同一时间只允许在一个客户端登录…

Matplotlib——绘制图表

文章目录通过figure()函数创建画布通过subplot()函数创建单个子图通过subplots()函数创建多个子图通过add_subplot()方法添加和选中子图添加各类标签绘制常见图表绘制直方图——hist()函数绘制散点图——scatter()函数绘制柱状图——bar()函数设定线条的相关参数本地保存图片通…

限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中&#xff0c;出于安全性考虑&#xff0c;经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是&#xff1a; 1、在同一台电脑上一次只允许有一个用户登录系统&#xff1b; 2、一个用户在同一时间只允许在一个客户端登录…

Seaborn——绘制统计图形

文章目录可视化数据的分布绘制单变量分布绘制双变量分布绘制成对的双变量分布用分类数据绘图类别散点图通过stripplot()函数画散点图swarmplot()函数类别内的数据分布绘制箱型图绘制提琴图类别内的统计估计绘制条形图绘制点图可视化数据的分布 绘制单变量分布 一般采用最简单…

Bokeh——交互式可视化库

文章目录前言如何通过Plotting绘制图形前言 Bokeh是一个专门针对Web浏览器使用的交互式可视化库&#xff0c;这是与其他可视化库相比最核心的区别。 如何通过Plotting绘制图形 Plotting是以构建视觉符号为核心的接口&#xff0c;可以结合各种视觉元素&#xff08;例如&#x…

指针、引用以及const限定符、constexpr限定符

文章目录复合类型引用概念与使用引用的定义注意指针概念声明方式取地址符指针值空指针利用指针访问对象赋值和指针void* 指针指向指针的指针指向指针的引用初始化所有指针有多重含义的某些符号const限定符概念const的引用指针和const顶层const和底层constconstexpr和常量表达式…

关键字typedef、关键字using、auto类型说明符和declytpe类型指示符

文章目录类型别名概念关键字 typedef别名声明 (alias declaration) using指针、常量和类型别名类型别名简化多维数组指针auto类型说明符概念复合类型、常量和autodecltype类型指示符概念decltype和引用类型别名 概念 有两种方法可用于定义类型别名。 关键字 typedef typede…

初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化

文章目录初始化和赋值的区别什么是默认初始化&#xff1f;列表初始化列表初始化的使用场景不适合使用列表初始化的场景类内初始值混用string对象和C风格字符串数组与vector对象关于vector对象两者间的初始化关系直接初始化与拷贝初始化初始化和赋值的区别 初始化的含义是创建变…

js动态增加,删除td,tr,table,div

js实现的动态添加&#xff0c;删除table内容&#xff1a; 截图如下&#xff1a; 1. 2. 源代码&#xff1a; main.css body {background-image: url(../images/qiantai/bg.png);font-family: arial;font-size: 12px;color: #d4d7da;text-align: center;background-repeat: r…

string类的相关知识及部分操作

文章目录string对象的初始化string::size_type类型string对象的读写操作使用标准库中的iostream使用getline读取一整行string对象的比较操作string对象的相加操作两个string对象相加字面值和string对象相加string对象的初始化 拷贝初始化(copy initialization)&#xff1a;使用…

数组的部分练习

3.27&#xff1a;假设txt_size是一个无参数的函数&#xff0c;它的返回值是int。请回答下列哪个定义是非法的&#xff1f;为什么&#xff1f; unsigned buf_size1024; &#xff08;a&#xff09;int ia[buf_size];  &#xff08;b&#xff09;int ia[4*7-14]; &#xff08…

关于范围for语句的使用

文章目录使用范围for语句处理多维数组使用范围for语句处理多维数组 举个例子&#xff0c;使用范围for语句输出多维数组&#xff08;ia&#xff09;所有值&#xff1a; for (const auto &row : ia)for (auto col : row)cout << col << endl;本循环中并没有任何…