利用 Python / R 对数据集进行「长」「宽」转换
晚上在微信群看到有人提問:
這其實是數據處理中經常遇到的數據集「長」「寬」格式轉換問題。看起來似乎挺難,有很多細節要考慮。實際上這個問題也的確不簡單,如果從零開始碼要花不少精力,效果還不好保證。
但是,因為這個問題太常見了,所以 Python / R 都提供了對應的函數來專門解決這個問題。
利用 Python 進行「長」「寬」轉換
Python 的 pandas package 提供了.melt( ) / .pivot( )兩個函數來做「長」「寬」轉換。前者將寬數據集轉換為長數據集,后者將長數據集轉換為寬數據集。
import pandas as pd
data = {'username':['張三','李四','王五'],
'數學':[34,45,76],
'語文':[58,87,34],
'英語':[578,45,89]}
df = pd.DataFrame(data)
df
觀察上表,我們很容易想到它還可以組織成 username,subject,score 這種形式:
melted = pd.melt(df,['username'])
一行代碼就能實現我們想要的操作。 .melt( ) 接收兩個參數,第一個參數是需要變換的數據集。第二個參數是一個列表,列表中指定的數據集的列作為分組的指標,剩下的所有列名合并為轉換后的數據集的一列,默認列名是 variable。分組指標和列名共同定位一個唯一的值,所有的這些值合并為一列,默認列名是 value。
最后,按需對變換后的數據集重命名。
melted.rename(columns = {'variable':'subject','value':'score'})
.melt( )?的逆操作是.pivot( )
pivoted = melted.pivot('username','subject','score')
.pivot()?的第一、二參數分別用作轉換后的數據集行和列索引,可選列作為轉換后的 dataframe 的值。如果不想將第一個參數作為行索引,可以將索引重置:
pivoted.columns = ['數學','英語','語文']
pivoted.reset_index()
利用 R 進行「長」「寬」轉換
R 的 tidyr package 提供了 spread( ) ?/ gather( )兩個函數來做「長」「寬」轉換。前者將寬數據集轉換為長數據集,后者將長數據集轉換為寬數據集。
data <- data.frame(username =c('張三','李四','王五'),
數學 =c(34,45,76),
語文 =c(58,87,34),
英語 =c(78,45,89))
data復制代碼
我們需要按照 username 將數學、語文、英文三個列名融合成一列 subject,并將對應的值融合成一列 score
gather() 的逆操作是 spread()
spread() 接收兩個參數,第一個參數對應的列的值轉換為寬數據集的列名,第二個參數對應的列的值轉換為寬數據集新建列的值。
閱讀原文可觀看在線 Python /R 版本 notebook,親自動手嘗試使用 R 對數據集進行「長」「寬」轉換。?
掃碼關注「數據科學與技術」(微信號:read_csv)
總結
以上是生活随笔為你收集整理的利用 Python / R 对数据集进行「长」「宽」转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DEDECMS中Showmsg的用法及参
- 下一篇: python pymongo+netwo