本文作者:王碧琪,中南財(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)

(二)堆疊處理
??下面,對(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é)果如下:

??結(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

??可以看到,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é)果如下:

(二)拆分?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é)果如下:

(三)重整數(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é)果如下:

??結(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哦~