Pivot

pivot函数用于创建一个新的派生表,该函数有三个参数:index, columns和values。你需要在原始表中指定这三个参数所对定的列名,接下来pivot函数会创建一个新的表格,其中行索引和列索引都是唯一标示值,表格中的数值由原始表中参数value对应的数据所表示。

from collections import OrderedDict
from pandas import DataFrame
import pandas as pd
import numpy as np
table = OrderedDict(( # 有序字典
("Item",['Item0','Item0','Item1','Item1']), # 相当于df中的一列
("CType",['Gold','Bronze','Gold','Silver']),
("USD",['1$','2$','3$','4$']),
("EU",['1€','2€','3€','4€'])
)) d = DataFrame(table)

其中 item 表示商品名称,USD 表示商品的美元价格,EU 表示欧元价格,CType 表示每个客户对应的类别。在这个表格中,我们很难观测到商品的美元价格在不同的客户中是如何变化的。此时我们倾向于重塑表格,使得所有的价格信息都按行排列:

p = d.pivot(index='Item', columns='CType', values='USD')

上述命令创建了一个新的表格,其中列索引是 CType 中的唯一值,行索引是 Item 中的唯一值,表格中的数值由 USD 来填充。下图形象地展示了这个过程:

下述代码介绍了如何分别从原始表和新表中查询数据:

# Original DataFrame: Access the USD cost of Item0 for Gold customers
print(d[(d.Item=='Item0') & (d.CType=='Gold')].USD.values) # Pivoted DataFrame: Access the USD cost of Item0 for Gold customers
print(p[p.index=='Item0'].Gold.values)

需要注意的是,该数据透视表中没有包含欧元价格的任何信息。事实上,数据透视表是原始表格的简化版本,它只包含我们所关心的变量信息。

现在我们对上述案例进行拓展,我们想将每个商品的欧元价格信息也纳入数据透视表中(Pivoting By Multiple Columns)。这非常容易实现——我们只需将 values 参数删掉即可:

p = d.pivot(index='Item', columns='CType')

此时,Pandas会在新表格中创建一个分层列索引。你可以将分层索引想象成一个树形索引,每个行/列索引都由从最顶层的索引到底部索引的路径所组成。最顶层的索引由pivot函数中没有定义的参数所组成——比如本例中的 USD 和 EU,第二层索引表示对应列中的所有唯一值。下图形象地展示了该过程:

我们可以利用分层索引从原始表中过滤出某个变量的数据。比如p.USD将返回只包含 USD 数据的数据透视表,p.USD.Bronze将上述透视表中的第一列筛选出来。

# Original DataFrame: Access the USD cost of Item0 for Gold customers
print(d[(d.Item=='Item0')&(d.CType=='Gold')].USD.values) # Pivoted DataFrame: p.USD gives a "sub-DataFrame" with the USD values only
print(p.USD[p.USD.index=='Item0'].Gold.values)

常见错误

从上文的描述中我们可以看出:pivot方法至少需要两个参数—— index 和 columns。那么如果原始数据集中存在重复条目时,重塑过程将会发生什么问题呢?pivot函数如何确定数据透视表中的数值呢?下图形象地展示了这个问题:

在这个案例中,原始数据集中存在重复条目,此时pivot函数无法确定数据透视表中的数值,它会返回一个错误信息:ValueError: Index contains duplicate entries, cannot reshape

因此,我们在调用pivot方法前需要保证数据集中不存在重复条目,否则我们需要调用另外一个方法——pivot_table。

Pivot Table

pivot_table方法可以用来解决上述问题,与pivot相比,该方法可以汇总多个重复条目的数据。换句话说,在前面的例子中,我们可以用均值、中位数或者其他汇总函数来计算重复条目的数值。下图形象地展示了这个过程:

注意,在这个例子中,我们移除了数据集中的美元和欧元符号。原始数据集中存在两行重复条目,我们利用样本均值来填充数据透视表中的数据。pivot_table方法需要传递一个新的参数 aggfunc,该参数用于指明转换时所需的汇总函数。

table = OrderDict((
('Item',['Item0','Item0','Item0','Item1']),
('CType',['Gold','Bronze','Gold','Silver']),
('USD',[1,2,3,4]),
('EU',[1.1,2.2,3.3,4.4])
)) d = DataFrame(table)
p=d.pivot_table(index='Item',columns='CType',values='USD', aggfunc=np.mean)

从本质上来说,pivot_table方法是pivot的通用版,该方法可以汇总重复条目的数据。

Stack/Unstack

实际上,轴向旋转(pivot)运算是堆叠(stack)过程的特例。首先假设原始数据集中的行列索引中均为层次索引。stack 过程表示将数据集的列旋转为行,同理 unstack 过程表示将数据的行旋转为列。下图形象地展示了该过程:

在这个例子中,我们看到原始数据集中的行列索引都由二级分层索引组成。堆叠过程主要是将最内层的列索引转换成最内层的行索引,然后再重新安排单元格中的数据。相反地,unstack 过程是讲最内层的行索引移到最内层的列索引中。

因此,我们可以发现 stack 使得数据集变得更长,unstack 使得数据集变得更宽。

# Row Multi-Index

row_idx_arr = list(zip(['r0','r0'],['r-00','r-01']))

row_idx = pd.MultiIndex.from_tuples(row_idx_arr)

# Column Multi-Index

col_idx_arr = lis(zip(['c0','c0','c1'], ['c-00','c-01','c-10']))

col_idx = pd.MultiIndex.from_tuples(col_idx_arr)

# Create the DataFrame

d = DataFrame(np.arange(6).reshape(2,3),index=row_idx,  columns=col_idx)

d = d.applymap(lambda x: (x // 3, x % 3))

# Stack/Unstack

s = d.stack()

u = d.unstack()

事实上,Pandas允许我们利用 stack/unstack 处理任一等级的索引。因此虽然默认设定处理最内层的索引,但是在上述的例子中,我们也可以处理最外层的索引。

Stacking 和 Unstacking 也可以运用到单层索引的数据集中,如下图所示:

1 Pandas中的数据重塑(reshape)功能

2 Reshaping in Pandas - Pivot, Pivot-Table, Stack and Unstack explained with Pictures

转自 https://blog.csdn.net/liuweiyuxiang/article/details/78220530

数据重塑图解—Pivot, Pivot-Table, Stack and Unstack的更多相关文章

  1. pandas学习(创建多层索引、数据重塑与轴向旋转)

    pandas学习(创建多层索引.数据重塑与轴向旋转) 目录 创建多层索引 数据重塑与轴向旋转 创建多层索引 隐式构造 Series 最常见的方法是给DataFrame构造函数的index参数传递两个或 ...

  2. R语言数据重塑cbind+rbind+merge+ melt+cast

    R语言中的数据重塑是关于变化的数据分为行和列的方式.大多数R地数据处理的时候是通过将输入的数据作为一个数据帧进行.这是很容易提取一个数据帧的行和列数据,但在某些情况,当我们需要的数据帧的格式是不同的来 ...

  3. MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it

    MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it 博客分类: 数据库 MySQLJava ...

  4. R语言 数据重塑

    R语言数据重塑 R语言中的数据重塑是关于改变数据被组织成行和列的方式. 大多数时间R语言中的数据处理是通过将输入数据作为数据帧来完成的. 很容易从数据帧的行和列中提取数据,但是在某些情况下,我们需要的 ...

  5. MySQL数据库插入数据出现 ERROR 1526 (HY000): Table has no partition for value xxx

    MySQL数据库插入数据出现ERROR 1526 (HY000): Table has no partition for value xxx工作的时候发现无法插入数据,报错:ERROR 1526 (H ...

  6. python pandas stack和unstack函数

    在用pandas进行数据重排时,经常用到stack和unstack两个函数.stack的意思是堆叠,堆积,unstack即"不要堆叠",我对两个函数是这样理解和区分的. 常见的数据 ...

  7. Pandas 基础(12) - Stack 和 Unstack

    这节的主题是 stack 和 unstack, 我目前还不知道专业领域是怎么翻译的, 我自己理解的意思就是"组成堆"和"解除堆". 其实, 也是对数据格式的一种 ...

  8. 利用Python进行数据分析(13) pandas基础: 数据重塑/轴向旋转

    重塑定义     重塑指的是将数据重新排列,也叫轴向旋转. DataFrame提供了两个方法: stack: 将数据的列“旋转”为行. unstack:将数据的行“旋转”为列. 例如: 处理堆叠格式 ...

  9. R中的数据重塑函数

    1.去除重复数据 函数:duplicated(x, incomparables = FALSE, MARGIN = 1,fromLast = FALSE, ...),返回一个布尔值向量,重复数据的第一 ...

随机推荐

  1. python之函数、面向对象

    学习python到了函数这一块进度有所放缓,主要还是想理解透彻,毕竟直觉告诉我函数是python是其中的关键,不管是模块.还是包.或者是库,都是建立在若干个函数定义上面. 章节后面就是关于面向对象编程 ...

  2. python基础之内置函数和匿名函数

      内置函数 学习函数以后多了很多概念,例如函数的命名空间,函数的作用域,函数的调用等等,函数的作用就是为了实现某些功能而方便以后可以调用,内置函数就是这样的一些公共的函数,被称为内置函数. 我们就一 ...

  3. css中的position 的absolute和relative的区别(转)

    我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...

  4. WPF使用资源图片

    一.加载本项目的图片 WPF引入了统一资源表示Uri来标识和访问资源.其中较为常见的情况是用Uri加载图像.Uri表达式的一把形式为:协议+授权+路径 协议:pack:// 授权:有两种,一种用于访问 ...

  5. Elasticsearch入门教程(六):Elasticsearch查询(二)

    原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  6. 无Xwindow的linux系统安装VMware Tools

    首先登陆linux 系统,最好是root用户: 然后挂载cdrom: mkdir -p /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom 进入cdro ...

  7. 记一次部署PHP遇到的编码问题故障

    php开发给我项目和数据库,我按正常部署流程部署,开始发现之梦的后台登陆不了,后发现是属主属组不对,代码直接解压后是root的,更改后,后台能登陆,但部分显示乱码.后将正常的数据库文件重新导入后,显示 ...

  8. vs2017新建一个空项目

    我们会发现VS2017的控制台程序创建之后会有一些头文件这和之前的VS的版本不一样之前的都可以选择空项目来避免,下面我们就来介绍方法: 首先我们不要创建新的控制台项目,而是创建桌面向导: 然后我们就可 ...

  9. PhpStorm中如何使用database工具,详细操作方法

    1.简介:   PhpStorm是一个轻量级且便捷的PHP IDE,其提供的智能代码补全,快速导航以及即时错误检查等功能大大提高了编码效率.它以其独特的开发便利性,短时间内赢得了大量PHPer的青睐. ...

  10. poj3522 苗条树(极差最小生成树)

    给你N个点和M条边 要求你求出一个生成树使得这个生成树里边权极差最小 做法① n*m做法 当最小的边已知的时候这个生成树就确定 所以最大的边也确定了 于是我们每次枚举最小的边 然后用kruskal做一 ...