首页 > 其他分享 >数据重塑图解Pivot, Pivot-Table, Stack and Unstack

数据重塑图解Pivot, Pivot-Table, Stack and Unstack

时间:2023-04-06 10:23:06浏览次数:57  
标签:USD Gold Item0 Table Unstack 索引 pivot Pivot

行转列,列转行 

[pandas学习笔记3—数据重塑图解Pivot, Pivot-Table, Stack and Unstack_Lavi_qq_2910138025的博客-CSDN博客](https://blog.csdn.net/liuweiyuxiang/article/details/78220530)

文章目录

 

数据重塑图解—Pivot, Pivot-Table, Stack and Unstack

引言

Pandas是python中常用的数据分析软件库,它提供了DataFrames和Series的工具,这使得numpy和matplotlib可以更加便捷地读取转换数据。

数据重塑表示转换一个表格或者向量的结构,使其适合于进一步的分析。Pandas拥有一些其他软件不具备的重塑功能,这对初学者来说可能会比较棘手。

本文中我将举例说明Pandas中一些常用的重塑函数,并结合图表进行阐述。

Pivot

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

是不是感觉有点难以理解呢?看完下面这个例子你就明白了,假设给定下面这个表格:

其中 item 表示商品名称,USD 表示商品的美元价格,EU 表示欧元价格,CType 表示每个客户对应的类别。
这里写图片描述
下述代码片段用于创建DataFrame,需要注意的是本文中所有的代码片段均需要导入以下模块:

from collections import OrderedDict

from pandas import DataFrame

import pandas as pd

import numpy as np

table = OrderDict((

("Item",['Item0','Item0','Item1','Item1']),

("CType",['Gold','Bronze','Gold','Silver']),

("USD",['1$','2$','3$','4$']),

("EU",['1€','2€','3€','4€'])

))

d = DataFrame(table)
  •  

在这个表格中,我们很难观测到商品的美元价格在不同的客户中是如何变化的。此时我们倾向于重塑表格,使得所有的价格信息都按行排列:

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

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

换句话说,原始表中的 USD 数据已经被转移到新表中,其中行列索引分别由 Item 和 CType 所表示,无法找到原始数据的用 NaN所表示。
这里写图片描述
下述代码介绍了如何分别从原始表和新表中查询数据:

# 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
这里写图片描述

table = OrderDict((

("Item",['Item0','Item0','Item0','Item1']),

('CType',['Gold','Bronze','Gold','Silver']),

('USD',['1$','2$','3$','4$']),

('EU',['1€','2€','3€','4€'])

))

d = DataFrame(table)

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

 

因此,我们在调用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 也可以运用到单层索引的数据集中,如下图所示:
这里写图片描述

参考文献
Pandas中的数据重塑(reshape)功能
Reshaping in Pandas - Pivot, Pivot-Table, Stack and Unstack explained with Pictures
3. python pandas stack和unstack函数 stack和unstack这篇的讲解不错

标签:USD,Gold,Item0,Table,Unstack,索引,pivot,Pivot
From: https://www.cnblogs.com/ministep/p/17291819.html

相关文章

  • 【win10】本地化部署stable diffusion AI绘图
    一、环境本地化部署运行虽然很好,但是也有一些基本要求(1)需要拥有NVIDIA显卡,GT1060起,显存4G以上(2)操作系统需要win10(3)电脑内存16G或者以上。(4)有些网页打不开,有时下载很慢。 二、安装miniconda1.安装miniconda这个是用来管理python版本的,他可以实现python的多版本切换。下......
  • 网络防火墙iptables
    防火墙简单介绍概念:是一种能够限制所转发的流量类型的路由器类型:1.代理防火墙本质上是运行一个或多个应用层网关的主机1.1HTTP代理防火墙只能用于HTTP和HTTPS协议(Web)。可以提供web缓存功能,加速防火墙内用户加载网页的速度提供黑名单功能,阻止用户访问某些web网站1.2......
  • 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:CompletableFuture)
    转载:https://blog.csdn.net/wsmalltiger/article/details/124236189文章目录[线上环境]Dubbo线程池占满原因排查系列前言一、问题分析1、分析日志2、定位原因二、解决方案三、总结前言  某天早上9点左右收到线上故障报警,超过3个商家反馈“无法正常进入功能页面,点击相关操作提......
  • 搭一下 Stable Diffusion WebUI
    Preface前不久看到好多朋友用上StableDiffusion来做原画,然后又配合上了Chatgpt。一直以来都想尝试一下,奈何2014款的双核mac跑个idea都发出了拖拉机的轰鸣声。所以一直都是看一半就搁置。然而,这也耐不住心情低落想要一些东西来分散自己的注意力,今天我就和他杠上了。硬件Mac......
  • 线程间数据传递之ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
    前言在JAVA中线程之间传输数据的方式有多种,而本文旨在探讨ThreadLocal及其衍生类的使用场景。使用场景业务系统的参数传递:在我们的业务系统中可能会用到许多公共参数,可能是用户的token信息,在我们链路中可能某一个方法需要用到它,那么我们又不想一层层的传递它。分布式系统要打......
  • 【防火墙 iptables】防火墙 白名单
    端口关闭与开放白名单有一台es端口9200,想指定白名单创建连接,于是先把这个端口的所有监听先关闭掉,再对应添加白名单iptables-IINPUT-ptcp--dport9200-jDROPiptables-IINPUT-s10.12.3.11-ptcp--dport9200-jACCEPTiptables-IINPUT-s10.12.3.12-ptcp--......
  • MySQL使用DROP TABLE命令删除表怎么恢复?
    前言今天同事勿删除了一个测试环境表,因为刚好在跑重要的数据,重新跑又比较麻烦,所以尝试看能不能通过恢复数据的方式进行数据恢复,如果你也是重要数据一定要切记“不要慌,慌也没用”。百度过一些例子,哪些例子比较适合表刚刚创建后被删除,就能完全恢复,本篇文章适合那种创建很长时间,表......
  • iptables 跳板机转发策略
    1、中转机执行策略。iptables-tnat-IPREROUTING-s10.*.*.125/30(对端过来地址出口)-ptcp-mtcp--dport28070-jDNAT--to-destination10.15.2.10:28070对端过来的流量转到到内网另一台机器iptables-tnat-IPREROUTING-s10.15.2.10-ptcp-mtcp--dport80-jD......
  • Element UI 【表格合计】el-table 实战范例 -- 添加单位,自定义计算逻辑
    需求描述末尾合计行的需求如下:第1列显示“合计”无法求和的列,显示“——”可以求和的列,显示求和结果,并添加对应的单位命中率列的合计逻辑为:总命中数/总射击次数代码实现要点详见代码中的备注<template><divclass="tableBox"><el-table:data="tableData"bo......
  • 【已解决】configure: error: C++ compiler cannot create executables
    1.背景 centos7在升级gccconfigure的时候出现的问题A100-01-$build#../configure--prefix=/usr/local/gcc--enable-threads=posix--disable-checking--disable-multilib--enable-languages=c,c++checkingbuildsystemtype...x86_64-pc-linux-gnucheckinghosts......