左手用R右手Python系列——数据塑型与长宽转换

今天这篇是R语言 with Python系列的第三篇,主要跟大家分享数据处理过程中的数据塑型与长宽转换。

其实这个系列算是我对于之前学习的R语言系列的一个总结,再加上刚好最近入门Python,这样在总结R语言的同时,对比R语言与Pyhton在数据处理中常用解决方案的差异,每一个小节只讲一个小知识点,但是这些知识点都是日常数据处理与清洗过程中非常高频的需求。

不会跟大家啰嗦太多每一个函数的详细参数,只列出那些参数中的必要设定,总体以简单实用为原则。如若需要详细了解每一个函数的内部参数,还是需要自己查阅官方文档。

数据长宽转换是很常用的需求,特别是当是从Excel中导入的汇总表时,常常需要转换成一维表(长数据)才能提供给图表函数或者模型使用。

在R语言中,提供数据长宽转换的包主要有两个:

reshape2::melt/dcast

tidyr::gather/spread

library("reshape2") library("tidyr")

mydata<-data.frame( Name = c("苹果","谷歌","脸书","亚马逊","腾讯"), Conpany = c("Apple","Google","Facebook","Amozon","Tencent"), Sale2013 = c(5000,3500,2300,2100,3100), Sale2014 = c(5050,3800,2900,2500,3300), Sale2015 = c(5050,3800,2900,2500,3300), Sale2016 = c(5050,3800,2900,2500,3300) )

数据重塑(宽转长):

melt函数是reshape2包中的数据宽转长的函数

mydata<-melt( mydata, #待转换的数据集名称 id.vars=c("Conpany","Name"), #要保留的主字段 variable.name="Year", #转换后的分类字段名称(维度) value.name="Sale" #转换后的度量值名称 )

转换之后,长数据结构保留了原始宽数据中的Name、Conpany字段,同时将剩余的年度指标进行堆栈,转换为一个代表年度的类别维度和对应年度的指标。(即转换后,所有年度字段被降维化了)。

在tidyr包中的gather也可以非常快捷的完成宽转长的任务:

data1<-gather( data=mydata, #待转换的数据集名称 key="Year", #转换后的分类字段名称(维度) value="Sale" , #转换后的度量值名称 Sale2013:Sale2016 #选择将要被拉长的字段组合 ) #(可以使用x:y的格式选择连续列,也可以以-z的格式排除主字段)

而相对于数据宽转长而言,数据长转宽就显得不是很常用,因为长转宽是数据透视,这种透视过程可以通过汇总函数或者类数据透视表函数来完成。

但是既然数据长宽转换是成对的需求,自然有对应的长转宽函数。

reshape2中的dcast函数可以完成数据长转宽的需求:

dcast( data=data1, #数据集名称 Name+Conpany~Year #x1+x2+……~class #这一项是一个转换表达式,表达式左侧列 #出要保留的主字段(即不会被扩宽的字段,右侧则是要分割的分类变量,扩展之后的 #宽数据会增加若干列度量值,列数等于表达式右侧分类变量的类别个数 )

除此之外,tidyr包中的spread函数在解决数据长转宽方面也是很好的一个选择。

spread:

spread( data=data1, #带转换长数据框名称 key=Year, #带扩宽的类别变量(编程新增列名称) value=Sale) #带扩宽的度量值 (编程新增列度量值)

从以上代码的复杂度来看,reshape2内的两个函数melt\dcast和tidyr内的两个函数gather\spread相比,gather\spread这一对函数完胜,不愧是哈神的最新力作,tidyr内的两个函数所需参数少,逻辑上更好理解,自始至终都围绕着data,key、value三个参数来进行设定,而相对老旧的包reshape2内的melt\dcast函数在参数配置上就显得不是很友好,他是围绕着一直不变的主字段来进行设定的,tidyr包则围绕着转换过程中会变形的维度和度量来设定的。

接下来是Python中的数据塑性与长宽转换。

Python中我只讲两个函数:

  • melt #数据宽转长
  • pivot_table #数据长转宽

Python中的Pandas包提供了与R语言中reshape2包内几乎同名的melt函数来对数据进行塑型(宽转长)操作,甚至连内部参数都保持了一致的风格。

import pandas as pd import numpy as np

mydata=pd.DataFrame({ "Name":["苹果","谷歌","脸书","亚马逊","腾讯"], "Conpany":["Apple","Google","Facebook","Amozon","Tencent"], "Sale2013":[5000,3500,2300,2100,3100], "Sale2014":[5050,3800,2900,2500,3300], "Sale2015":[5050,3800,2900,2500,3300], "Sale2016":[5050,3800,2900,2500,3300] })

mydata1=mydata.melt( id_vars=["Name","Conpany"], #要保留的主字段 var_name="Year", #拉长的分类变量 value_name="Sale" #拉长的度量值名称 )

除此之外,我了解到还可以通过stack、wide_to_long函数来进行宽转长,但是个人觉得melt函数比较直观一些,也与R语言中的数据宽转长用法一致,推荐使用。

奇怪的是我好像没有在pandas中找到对应melt的数据长转宽函数(R语言中都是成对出现的)。还在Python中提供了非常便捷的数据透视表操作函数,刚开始就已经说过是,长数据转宽数据就是数据透视的过程(自然宽转长就可以被称为逆透视咯,PowerBI也是这么称呼的)。

pandas中的数据透视表函数提供如同Excel原生透视表一样的使用体验,即行标签、列标签、度量值等操作,根据使用规则,行列主要操作维度指标,值主要操作度量指标。

那么以上长数据mydata1就可以通过这种方式实现透视。

mydata1.pivot_table( index=["Name","Conpany"], #行索引(可以使多个类别变量) columns=["Year"], #列索引(可以使多个类别变量) values=["Sale"] #值(一般是度量指标) )

通常这种操作也可以借助堆栈函数来达到同样的目的。(但是使用stack\unstack需要额外设置多索引,灰常麻烦,所以不是很推荐,有兴趣可以查看pandas中的stack/unstack方法,这里不再赘述)。

综上所述,本文主要提供了R语言与Python中用于处理数据重塑(长宽转换的常用解决方案)。

R语言:

  • reshape2::melt
  • reshape2::dcast
  • tidyr::gather
  • tidyr::spread

Python:

  • pandas-melt
  • pandas-pivot_table
  • (备选方案——stack/unstack、wide_to_long)

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蜉蝣禅修之道

网络流算法Push-relabel的Python实现

41950
来自专栏深度学习自然语言处理

【笔记】高效率但却没用过的一些numpy函数

最近在看源码的时候,碰到了一些大佬们常用,但自己暂时还没用过的numpy函数,特意来总结下。

8220
来自专栏互联网杂技

算法复杂度分析

为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU 消耗) 内存空间(RAM 消耗) 通信时间(带宽消耗) 预测算法的运行时间 在给定输入规模时,所执...

44070
来自专栏Petrichor的专栏

深度学习: global pooling (全局池化)

今天看SPPNet论文时,看到“global pooling”一词,不是很明白是啥概念。上网查了一下定义,在StackOverflow 上找到了答案:

62830
来自专栏生信宝典

R语言学习 - 箱线图(小提琴图、抖动图、区域散点图)

箱线图 箱线图是能同时反映数据统计量和整体分布,又很漂亮的展示图。在2014年的Nature Method上有2篇Correspondence论述了使用箱线图的...

1.1K100
来自专栏人工智能

从概念到实践,我们该如何构建自动微分库

选自Medium 作者:Maciej Kula 机器之心编译 参与:程耀彤、蒋思源 像 PyTorch 或 TensorFlow 这样通用的自动微分框架是非常有...

217100
来自专栏量子位

PyTorch 0.2发布:更多NumPy特性,高阶梯度、分布式训练等

李林 编译整理 量子位 报道 | 公众号 QbitAI Facebook的机器学习框架(之一)PyTorch今天发布了新版本:0.2.0。 这一版本引入了Num...

396150
来自专栏kangvcar

[face_recognition中文文档] 第3节 用法

14630
来自专栏一棹烟波

3DLut表实现log视频的后期调色原理

现在越来越多的视频或者图像拍摄设备支持log模式,比如大疆无人机的D-Log模式等等,log模式的起源和发展就不多做介绍,其在普通显示器上显示画面通常看起来是平...

41520
来自专栏机器之心

深度 | 从概念到实践,我们该如何构建自动微分库

31480

扫码关注云+社区

领取腾讯云代金券