引言Pandas 是 python中常用的数据分析软件库,它提供了 DataFrames 和 Series 的工具,这使得 numpy 和 matplotlib 可以更加便捷地读取转换数据。数据重塑表示转换一个表格或者向量的结构,使其适合于进一步的分析。Pandas拥有一些其他软件不具备的重塑功能,这对初学者来说可能会比较棘手。本文中我将举例说明Pandas中一些常用的重塑函数,并结合图表进行阐述。

pivotpivot函数用于创建一个新的派生表,该函数有三个参数: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 Tablepivot_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-Indexcol_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 也可以运用到单层索引的数据集中,如下图所示:

reshape功能介绍_Pandas中的数据重塑(reshape)功能相关推荐

  1. python实现Excel中的数据透视表功能

    主要利用pandas包中的pd.pivot_table()函数. male_emo=pd.pivot_table(emo,index='year',columns='emotion',values={ ...

  2. 软件架构-Spring boot快速开始及核心功能介绍(中)

    上次通过Spring boot认知,核心功能.springBoot的搭建[官方向导搭建boot应用]和 [maven的方式搭建boot]. 统一父POM管理(一) ① 建立boot-parent工程 ...

  3. excel中的数据链接/连接功能使用场景举例(NPS统计)

    1.刷新数据的路径2.数据连接的编辑路径,在定义目录下可以直接用sql语句限定取数范围

  4. python功能分享_Python中非常实用的一些功能和函数分享

    在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些你应该了解的Python功能特色. 带任意数量参数的函数你可能 ...

  5. Boost库-功能介绍-Geometry-图形开发库-计算几何-常用功能封装-GraphicalDebugging(二)

      有了上一篇博文打下的基础,读者应该对分析查看几何图形有了初步了解,本着实用的原则,这篇文章,主要介绍Geometry的常用计算.它提供了点线面相交,相离的判断,以及多边形的布尔运算,在几何分析中非 ...

  6. 教育培训软件的基础功能介绍培训管理系统教师在线直播教育功能开发方案

    系统优势 1.大幅降低学校信息化建设成本(包括:局域网建设.服务器采购.软件采购.网管人员薪资.人员培训等成本). 2.让教务管理人员从繁重的工作中彻底解脱出来,使教务工作变得更简单,可靠,安全,方便 ...

  7. VS中自用插件的设置的翻译或功能介绍系列

    本系列为了留存自用的部分插件的设置或功能介绍,以便后续想要更改某些设置或忘记某些特性时方便查找和回看. 本文不定期更新和增删. VS2017字体和颜色设置 自用的字体和颜色设置 PowerMode 敲 ...

  8. iOS Simulator功能介绍关于Xamarin IOS开发

    iOS Simulator功能介绍关于Xamarin IOS开发 iOS Simulator功能介绍 在图1.38所示的运行效果中,所见到的类似于手机的模型就是iOS Simulator.在没有iPh ...

  9. sql server 怎么把视图中的数据存到另外一张表中_承上篇,自制插件优化Kep数据存储问题...

    序言:上篇说到Kep数据日志存储是将所有数据存到一张表内,不好筛选,为此抽空做了这个插件对Kep存到SQL的数据表进行优化处理. 一.插件安装及界面功能标注 1.双击安装包弹出安装向导,直接下一步直到 ...

最新文章

  1. ios wallet开发_iOS: 使用UICollectionView实现Wallet效果
  2. IoT和AI如何让企业在疫情期间重启业务
  3. mysql 关联关系
  4. [linux] SIGPIPE信号处理
  5. python编程django项目django.template.exceptions.TemplateDoesNotExist: registration/login.html解决方法
  6. c++将int转换成string_Integer与int的区别 (== 与 equal)
  7. wildfly_从WildFly 9(子系统)中运行OkHttpClient
  8. 程序员作图工具和技巧,你 get 了么?
  9. qt5.8连接mysql代码_qt5.8如何连接mysql
  10. java 操作属性值_java反射机制根据属性名获取属性值的操作
  11. 数据挖掘原理与算法 DBSCAN
  12. 优秀的CSS布局大全
  13. 计算机二级c语言选择题pdf,计算机二级c语言选择题库(带答案)[汇编].pdf
  14. html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
  15. Struts2(Maven),小白版
  16. php 获取域名前缀,PHP获取域名方法
  17. Android Toast的时长
  18. 为什么有的人飞黄腾达,有的人穷困潦倒 .
  19. 两直线平行交叉相乘_高中数学知识点:向量平行公式和垂直公式
  20. 【微信】一、微信开发环境

热门文章

  1. 分类问题 (一) : 基本定义
  2. 无妄之灾之域名外网地址切换后,域名访问部分机器有问题
  3. 安装GotoBLAS和hpl
  4. SmartRefreshLayout 上拉加载下拉刷新
  5. 外卖添加订单c语言设计,外卖平台订单分配系统设计是什么?其功能有哪些?
  6. 一、重写muduo网络库之服务器编程及测试
  7. Cocos create
  8. JAVA读取excel数据(插入oracle数据库)
  9. php指令字符编码,如何在命令行上编码和解码percent-encoded字符串?
  10. Apache、Tomcat与Catalina作为软件名字的含义与关系