在数据分析的过程中,分析师常常希望通过多个维度多种方式来观察分析数据,重塑和透视是常用的手段。
数据的重塑简单说就是对原数据进行变形,为什么需要变形,因为当前数据的展示形式不是我们期望的维度,也可以说索引不符合我们的需求。对数据的重塑不是仅改变形状那么简单,在变形过程中,数据的内在数据意义不能变化,但数据的提示逻辑则发生了重大的改变。
数据透视是最常用的数据汇总工具,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)相关推荐

  1. pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)

    数据分析离不开数据运算,在介绍完pandas的数据加载.排序和排名.数据清洗之后,本文通过实例来介绍pandas的常用数据运算,包括逻辑运算.算术运算.统计运算及自定义运算. 一.逻辑运算 逻辑运算是 ...

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

    文章目录 重塑层次化索引 对于单层索引的DataFrame类对象 stack()方法 unstack()方法 对于多层索引的DataFrame类对象 辨析操作内层索引与外层索引的区别 查看多层索引对象 ...

  3. Pandas数据分析常用数据操作(3年总结)

    原创文章,转载请注明来源,谢谢 导入设置 import odps import numpy as np import pandas as pd import matplotlib as mpl imp ...

  4. pandas -----变形(透视表、melt、stack、unstack),哑变量与因子变化

    目录 导入数据 1. 透视表 1. 1 pivot 1.2. pivot_table 1.3 crosstab(交叉表) 2.其他变形方法 2.1. melt 2.2. 压缩与展开 3.哑变量与因子化 ...

  5. Python 全栈 400 之Pandas数据分析练习

    288 Pandas 读取 URL 路径的文件 数据输入路径,可以是文件路径,也可以是 URL,或者实现 read 方法的任意对象. 如下经典的数据集 iris,直接通过 URL 获取. In [16 ...

  6. 【愚公系列】2023年07月 Pandas数据分析之展示

    文章目录 一.Pandas数据分析之展示 1.Pandas的概念和基本使用 2.排序 3.按多列排序 4.添加一列 5.快速元素搜索 6.按列连接(join) 7.按列分组 8. 数据透视表 9. P ...

  7. Pandas数据分析—使用stack和pivot实现数据透视

    15.Pandas使用stack和pivot实现数据透视 文章目录 15.Pandas使用stack和pivot实现数据透视 前言 一.经过统计得到多维度指标数据 二.使用unstack实现数据的二维 ...

  8. Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  9. Python数据分析小技巧:如何在Pandas中实现数据透视表?

    Python数据分析小技巧:如何在Pandas中实现数据透视表? 数据透视表是数据分析中非常有用的工具,可以帮助我们快速了解数据的结构.关联和趋势.在Pandas中,我们可以使用pivot_table ...

最新文章

  1. hdu4604 不错的子序列问题
  2. 一次二次开发中的经验与教训(一)
  3. 使用windbg排查一个内存溢出的问题
  4. boost::basic_string_ref相关的测试程序
  5. Python程序退出方式小结(亲测)
  6. linux shell之cut命令
  7. Learning XNA 3.0翻译连载--序言
  8. Java中volatile的作用以及用法
  9. .Net 面试题 汇总(二)
  10. 【转】化学怀旧风:用扑热息痛冲胶卷!
  11. (5)数据结构-栈顺序存储
  12. 微信小程序自定义组件中对properties的修改
  13. 乐王微博访谈实录 转
  14. you_get下载视频报错 don‘t panic, c‘est la vie. please try the following steps
  15. 食品科学与工程考研可以考计算机吗,食品科学与工程女汉子,对于考研比较迷茫,有几个问题麻烦各位前辈指点迷津,谢谢 。 - 考研 - 小木虫 - 学术 科研 互动社区...
  16. 谁的青春不军训? 教官用了Iterator Pattern都说好
  17. MaxEnt运行报错的各种问题及解决方法
  18. VS Code 2022路线图:大量Spring Boot优化提上日程
  19. 黑马培训教学SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied
  20. iPhone界面跳转

热门文章

  1. Avoid mutating a prop directly since the value will be overwritten whenever
  2. AndroidManifest基本定义
  3. 【高并发高性能高可用之海量数据MySQL实战-3】-MySQL逻辑架构图
  4. 7脚spi OLED屏幕改造成IIC屏幕
  5. android椭圆进度,Android 圆形进度条
  6. Linux系列学习(二) - Vim编辑器的介绍及使用、文件编译的过程、Makefile工具、Gdb调试器
  7. 餐厅自助点餐系统测试
  8. visio里的各种箭头
  9. 解决IMP-00058和IMP-00000
  10. 【自动化办公】python批量替换word中的内容