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