在Python中實(shí)現(xiàn)Stata的stack功能

本文作者:王碧琪,中南財(cái)經(jīng)政法大學(xué)金融學(xué)院
文字編輯:任?哲
技術(shù)總編:張馨月

一、多列變一列

??在文章《用stack取代excel的數(shù)據(jù)重整操作吧》中介紹了Stata中的stack操作,今天本文將使用Python中的pandas庫(kù)來(lái)實(shí)現(xiàn)相同功能。

(一)準(zhǔn)備工作

??首先,更改工作路徑,導(dǎo)入相關(guān)庫(kù),讀取xlsx文件。本文所使用的“身高.xlsx”文件中包含5列數(shù)據(jù),每列數(shù)據(jù)包含12行,每一個(gè)變量值都是身高。將五列數(shù)據(jù)的列名分別設(shè)置為A、B、C、D、E,代表5個(gè)班級(jí),我們的最終目的是把5列數(shù)據(jù)堆疊到1列中。

import os 
os.chdir('g:/stack') #更改工作路徑
import pandas as pd #導(dǎo)入pandas庫(kù)
#多變一 讀取xlsx文件
df1=pd.read_excel('身高.xlsx',header=None,names=['A','B','C','D','E']) #設(shè)置列名為A-E
print(df1)
image

(二)堆疊處理

??下面,對(duì)該數(shù)據(jù)集進(jìn)行堆疊處理,所使用的函數(shù)為pandas庫(kù)中包含stack()函數(shù)。

??該函數(shù)的官方描述為從列到索引堆疊指定類(lèi)別。與當(dāng)前數(shù)據(jù)相比,堆疊后的數(shù)據(jù)新生成了一個(gè)或者多個(gè)最內(nèi)層索引,最內(nèi)層索引是通過(guò)旋轉(zhuǎn)當(dāng)前數(shù)據(jù)的列而生成的。

??該函數(shù)的語(yǔ)法為:DataFrame.stack(level=-1,dropna=True)

??其中,level代表從列到索引的層次,默認(rèn)為-1,dropna為是否刪除包含缺失值的行,默認(rèn)為T(mén)rue。

??接下來(lái)對(duì)df1進(jìn)行操作。

df2=df1.stack() 
print(df2)
#df2.to_excel('out身高.xlsx') #導(dǎo)出數(shù)據(jù)

??部分結(jié)果如下:

image

??結(jié)果顯示,df2包含2列數(shù)據(jù),第一列為df1的列名,第二列為df1中對(duì)應(yīng)的身高數(shù)據(jù)。stack()函數(shù)將df1中的A-E列堆疊到df2的第一列中,形成了一層新的內(nèi)層索引。

(三)返回原始數(shù)據(jù)

??pandas中也包含stack()函數(shù)的反函數(shù)unstack(),可以返回到堆疊前的數(shù)據(jù)。

df3=df2.unstack()
df3
image

??可以看到,df3與最初的df1完全相同。

二、多列變多列

(一)讀取數(shù)據(jù)

??首先,讀入“股票行情.csv”,該數(shù)據(jù)集共包括16列、59行數(shù)據(jù)。其中,前8列與后8列均為股票交易數(shù)據(jù),由于列名不能重復(fù),9-16列的列名自動(dòng)加上后綴.1。

#多變多 讀取csv文件
df4=pd.read_csv('股票行情.csv',encoding='gb18030')
df4

??部分結(jié)果如下:

image

(二)拆分?jǐn)?shù)據(jù)

??接下來(lái),選取第9-16列數(shù)據(jù),重命名為1-8列的列名,使二者列名完全相同,方便下一步合并。

df5=df4.iloc[:,8:] #選取第9-16列的數(shù)據(jù)
df5.columns=['交易日期','證券代碼','證券簡(jiǎn)稱','前收','今收','升跌(%)','成交金額(元)','市盈率'] #重命名列名
df5

部分結(jié)果如下:

image

(三)重整數(shù)據(jù)

??按照類(lèi)似的原理,將前8列數(shù)據(jù)進(jìn)行重整,創(chuàng)建df6。之后,采用append()函數(shù)縱向拼接。

df6=df4.iloc[:,:8] #選取前8列數(shù)據(jù)
df7=df6.append(df5,ignore_index=True) #將前8列數(shù)據(jù)和后8列數(shù)據(jù)縱向拼接,忽略索引值
df7
#df7.to_excel('out股票行情.xlsx') #導(dǎo)出數(shù)據(jù)

??結(jié)果如下:

image

??結(jié)果顯示,df7中包含118行、8列數(shù)據(jù),append()函數(shù)將上述兩個(gè)df縱向拼接起來(lái),得到目標(biāo)結(jié)果。

??以上就是如何利用Python中的pandas庫(kù)進(jìn)行操作來(lái)實(shí)現(xiàn)stack的功能。當(dāng)然,本文只展示了其中部分功能,感興趣的小伙伴們可以繼續(xù)深挖學(xué)習(xí)pandas哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容