左手用R右手Python系列——數據塑型與長寬轉換

今天這篇是R語言 with Python系列的第三篇,主要跟你們分享數據處理過程當中的數據塑型與長寬轉換。編程


其實這個系列算是我對於以前學習的R語言系列的一個總結,再加上恰好最近入門Python,這樣在總結R語言的同時,對比R語言與Pyhton在數據處理中經常使用解決方案的差別,每個小節只講一個小知識點,可是這些知識點都是平常數據處理與清洗過程當中很是高頻的需求。微信


不會跟你們囉嗦太多每個函數的詳細參數,只列出那些參數中的必要設定,整體以簡單實用爲原則。如若須要詳細瞭解每個函數的內部參數,仍是須要本身查閱官方文檔。數據結構


數據長寬轉換是很經常使用的需求,特別是當是從Excel中導入的彙總表時,經常須要轉換成一維表(長數據)才能提供給圖表函數或者模型使用。ide


在R語言中,提供數據長寬轉換的包主要有兩個:函數


reshape2::melt/dcast學習

tidyr::gather/spreadspa


library("reshape2").net

library("tidyr")3d


mydata<-data.frame(orm

       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)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索