pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)
在数据分析的过程中,分析师常常希望通过多个维度多种方式来观察分析数据,重塑和透视是常用的手段。
数据的重塑简单说就是对原数据进行变形,为什么需要变形,因为当前数据的展示形式不是我们期望的维度,也可以说索引不符合我们的需求。对数据的重塑不是仅改变形状那么简单,在变形过程中,数据的内在数据意义不能变化,但数据的提示逻辑则发生了重大的改变。
数据透视是最常用的数据汇总工具,Excel 中经常会做数据透视,它可以根据一个或者多个指定的维度来聚合数据。pandas 也提供了数据透视函数来实现这些功能。
如果能熟练区分和使用各种重塑和透视分析方法,那用pandas处理分析日常的数据基本上就没有什么难度了。
在介绍数据重塑透视之前,先来介绍一下pandas中DataFrame的层次化索引,它广泛应用于重塑透视操作。
一、层次化索引
层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引层数,分层索引的目的是用低维度的结构(Series 或者 DataFrame)更好地处理高维数据。通过分层索引,我们可以像处理二维数据一样,处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单。
我们来看一下student数据集,并根据该数据集分别构建列和行的层次索引。然后再介绍数据的重塑和透视。
引入student数据集:
import numpy as np
import pandas as pd
df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\student.xlsx')
df
该student数据集包含学生学号、姓名、语文、数据、英语的成绩等。
1、列索引分层
我们选取一些关键的数据构建列标签的层次化索引。这里我们选取’班级’,‘姓名’,‘语文’,‘数学’,'英语’的列,并且将‘班级’、‘姓名’标记为‘标识’,‘语文’,‘数学’,'英语’标记为‘成绩’
df_student=df[['班级','2-姓名','4-语文','5-数学','6-英语']]
df_student.columns=[['标识','标识','成绩','成绩','成绩'],['班级','姓名','语文','数学','英语']]
df_student
通过指定DataFrame的columns的层级将’班级’,‘姓名’,‘语文’,‘数学’,‘英语’,上多抽出了一个层级,这个层有两个索引一个是‘标识’,一个是成绩,其中‘班级’和‘名称’是属于标识,‘语文’,‘数学’,‘英语’都是’成绩’。
2、行索引分层
接下来看行索引的分层。我们将属于一班的和属于二班的同学进行分层,再分成两个索引。
#根据行索引分层,设置行索引将其分成班级和姓名两个层次索引
df_student=df_student.set_index([('标识','班级'),('标识','姓名')])
df_student.index.names=['班级','姓名']
df_student
可以看到将数据集的班级和姓名列分成了两个行的层级索引。没有用默认的0-9的行索引
二、数据堆叠与拆堆
层次化索引为DataFrame数据的重排任务提供了一种具有良好一致性的方式,有许多用于重新排列表格数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot)运算。
常见的数据重塑包括数据的堆叠 stack 和 取消堆叠 unstck
1、数据堆叠 stack
堆叠 stack ,顾名思义,就是将列的数据堆叠形成行。
借用pandas官网的示意图:
看实际数据数据会更容易理解,为了方便我们取student数据集的前5行记录来进行数据堆叠stack()
df_student[:5]
#将数据进行堆叠
#将数据进行堆叠
df_student5=df_student[:5].stack()
df_student5
在这里可以看到通过stack()将“语文”、“数学”、“英语”,三列,一个个堆叠形成一条记录的三行。这样列数减少了,行数增多了。
对于多层索引,可以根据指定堆叠层次,默认是最高层次的堆叠。
我们来看指定堆叠层次,如果stack(0)
,表示堆叠level0层的。
2、取消堆叠 unstack
取消堆叠 unstack是堆叠的反操作。
也就是将堆叠好了的行数据,一个个卸下来形成列。这样一来行数减少了,但是列数增多了。
# 取消堆叠 unstack()
df_student5.unstack()
可以看到原来的“语文”、“数学”、"英语"三行,通过unstack()进行拆堆,拆成了三列,明显数据没有那么高了,行数少了,列数多了。
同样对于多层索引可以逐层拆堆
三、数据融合与透视
数据透视是最常用的数据汇总工具,它可以根据一个或者多个指定的维度来聚合数据。实际上搞懂了stack和unstack就很容易搞懂pivot和melt了,stack和unstack根据索引来进行堆叠和拆堆,pivot和melt可以根据指定的数据来进行变换操作灵活性更高。
1、数据融合 melt
来看pandas官网的示意图,是不是和stack的图有点类似,都是将列转换成行,不同的是melt可以指定哪些列固定,哪些列转换成行等灵活性更高。简单说就是将指定的列放到铺开放到行上名为variable(可指定)列,值在value(可指定)列
melt语法:
pd.melt(frame: pandas.core.frame.DataFrame,id_vars=None, value_vars=None,var_name='variable', value_name='value',col_level=None)
其中:
- id_varstuple,list或ndarray(可选),用作标识变量的列。
- value_varstuple,列表或ndarray,可选,要取消透视的列。 如果未指定,则使用未设置为id_vars的所有列。
- var_namescalar,用于“变量”列的名称。 如果为None,则使用frame.columns.name或“variable”。
- value_namescalar,默认为“ value”,用于“ value”列的名称。
- col_levelint或str,可选,如果列是MultiIndex,则使用此级别来融化。
我们还是来看示例:
数据集还是student数据集,为了演示方便取前5条记录
df_student=df[['班级','2-姓名','4-语文','5-数学','6-英语']]
df_student.columns=[['标识','标识','成绩','成绩','成绩'],['班级','姓名','语文','数学','英语']]
df_student[0:5]
现在将“班级”和“姓名”固定,‘语文’,‘数学’,'英语’三列转换成行融合为“学科”字段,这三个列的值定义为“分数”列。
# 将“班级”和“姓名”固定,'语文','数学','英语'三列转换成行融合为“学科”字段,这三个列的值定义为“分数”列
df_student[0:5].melt(id_vars=['班级','姓名'],value_vars=['语文','数学','英语'],var_name='学科',value_name='分数',col_level=1)
具体实现如下图所示:
2、数据透视 pivot
来看pandas官网的示意图,是不是和unstack的图有点类似,将行数据转换成列。同样pivot提供了更多的参数可以指定相应的数据进行转换,比unstack更加灵活。
这里有三个参数,作用分别是:
- index:新 df 的索引列,用于分组,如果为None,则使用现有索引
- columns:新 df 的列,如果透视后有重复值会报错
- values:用于填充 df 的列。 如果未指定,将使用所有剩余的列,并且结果将具有按层次结构索引的列
df_student5=df_student[0:5].melt(id_vars=['班级','姓名'],value_vars=['语文','数学','英语'],var_name='学科',value_name='分数',col_level=1)
df_student5
df_student5.pivot(index=['班级','姓名'],columns='学科',values='分数')
这里通过pivot将“学科”的行数据透视转换成“数学”、“英语”、“语文”三列,具体实现如下图所示:
可以看出privot实际和unstack类似是由行转换成列的视图,但比起unstack更加灵活。
至此,介绍了pandas的多层索引及pandas的4种重塑操作:stack、unstack、pivot、melt:
stack、unstack是基础:stack实现列转行,unstack实现行转列。
melt与stack类似,比stack更加灵活。
pivot与unstack类似,比unstack更加灵活。
数据集及源代码见:https://github.com/xiejava1018/pandastest.git
作者博客:http://xiejava.ishareread.com/
pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)相关推荐
- pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)
数据分析离不开数据运算,在介绍完pandas的数据加载.排序和排名.数据清洗之后,本文通过实例来介绍pandas的常用数据运算,包括逻辑运算.算术运算.统计运算及自定义运算. 一.逻辑运算 逻辑运算是 ...
- Python之数据重塑——【stack()方法和unstack()方法、pivot()方法】
文章目录 重塑层次化索引 对于单层索引的DataFrame类对象 stack()方法 unstack()方法 对于多层索引的DataFrame类对象 辨析操作内层索引与外层索引的区别 查看多层索引对象 ...
- Pandas数据分析常用数据操作(3年总结)
原创文章,转载请注明来源,谢谢 导入设置 import odps import numpy as np import pandas as pd import matplotlib as mpl imp ...
- pandas -----变形(透视表、melt、stack、unstack),哑变量与因子变化
目录 导入数据 1. 透视表 1. 1 pivot 1.2. pivot_table 1.3 crosstab(交叉表) 2.其他变形方法 2.1. melt 2.2. 压缩与展开 3.哑变量与因子化 ...
- Python 全栈 400 之Pandas数据分析练习
288 Pandas 读取 URL 路径的文件 数据输入路径,可以是文件路径,也可以是 URL,或者实现 read 方法的任意对象. 如下经典的数据集 iris,直接通过 URL 获取. In [16 ...
- 【愚公系列】2023年07月 Pandas数据分析之展示
文章目录 一.Pandas数据分析之展示 1.Pandas的概念和基本使用 2.排序 3.按多列排序 4.添加一列 5.快速元素搜索 6.按列连接(join) 7.按列分组 8. 数据透视表 9. P ...
- Pandas数据分析—使用stack和pivot实现数据透视
15.Pandas使用stack和pivot实现数据透视 文章目录 15.Pandas使用stack和pivot实现数据透视 前言 一.经过统计得到多维度指标数据 二.使用unstack实现数据的二维 ...
- Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换
CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...
- Python数据分析小技巧:如何在Pandas中实现数据透视表?
Python数据分析小技巧:如何在Pandas中实现数据透视表? 数据透视表是数据分析中非常有用的工具,可以帮助我们快速了解数据的结构.关联和趋势.在Pandas中,我们可以使用pivot_table ...
最新文章
- hdu4604 不错的子序列问题
- 一次二次开发中的经验与教训(一)
- 使用windbg排查一个内存溢出的问题
- boost::basic_string_ref相关的测试程序
- Python程序退出方式小结(亲测)
- linux shell之cut命令
- Learning XNA 3.0翻译连载--序言
- Java中volatile的作用以及用法
- .Net 面试题 汇总(二)
- 【转】化学怀旧风:用扑热息痛冲胶卷!
- (5)数据结构-栈顺序存储
- 微信小程序自定义组件中对properties的修改
- 乐王微博访谈实录 转
- you_get下载视频报错 don‘t panic, c‘est la vie. please try the following steps
- 食品科学与工程考研可以考计算机吗,食品科学与工程女汉子,对于考研比较迷茫,有几个问题麻烦各位前辈指点迷津,谢谢 。 - 考研 - 小木虫 - 学术 科研 互动社区...
- 谁的青春不军训? 教官用了Iterator Pattern都说好
- MaxEnt运行报错的各种问题及解决方法
- VS Code 2022路线图:大量Spring Boot优化提上日程
- 黑马培训教学SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied
- iPhone界面跳转
热门文章
- Avoid mutating a prop directly since the value will be overwritten whenever
- AndroidManifest基本定义
- 【高并发高性能高可用之海量数据MySQL实战-3】-MySQL逻辑架构图
- 7脚spi OLED屏幕改造成IIC屏幕
- android椭圆进度,Android 圆形进度条
- Linux系列学习(二) - Vim编辑器的介绍及使用、文件编译的过程、Makefile工具、Gdb调试器
- 餐厅自助点餐系统测试
- visio里的各种箭头
- 解决IMP-00058和IMP-00000
- 【自动化办公】python批量替换word中的内容