PYTHON PANDAS之數據重塑(Data Reshaping)

實際遇到的問題數據庫

在CSV文件當中或者數據庫當的數據一般以長格式或者(stacked)堆疊格式存儲,特別是金融數據中出現的時間序列數據,例如:api

In [1]: df
Out[1]: 
         date variable     value
0  2000-01-03        A  0.469112
1  2000-01-04        A -0.282863
2  2000-01-05        A -1.509059
3  2000-01-03        B -1.135632
4  2000-01-04        B  1.212112
5  2000-01-05        B -0.173215
6  2000-01-03        C  0.119209
7  2000-01-04        C -1.044236
8  2000-01-05        C -0.861849
9  2000-01-03        D -2.104569
10 2000-01-04        D -0.494929
11 2000-01-05        D  1.071804

那怎麼才能變成以A,B,C,D做爲列名,同時日期爲索引的dataframe呢?特別須要對A,B,C,D同時進行時間序列分析時,這個需求特別強烈。函數

解決方案:
這裏引出一個重要的概念,data reshaping,即數據重塑,code

選出變量A的全部數據咱們只須要以下操做,而後分別選出B,C,D,而後再再水平方向進行concat操做,這樣固然也能夠獲得指定的數據框,但這樣無疑編寫、執行效率都有點低:索引

In [2]: df[df['variable'] == 'A']
Out[2]: 
        date variable     value
0 2000-01-03        A  0.469112
1 2000-01-04        A -0.282863
2 2000-01-05        A -1.509059

可是若是咱們但願對變量進行時間序列操做,那麼咱們可能將須要將每一個變量單獨做爲一列來表示,所以須要使用pivot()函數對數據進行reshape操做:效率

In [3]: df.pivot(index='date', columns='variable', values='value')
Out[3]: 
variable           A         B         C         D
date                                              
2000-01-03  0.469112 -1.135632  0.119209 -2.104569
2000-01-04 -0.282863  1.212112 -1.044236 -0.494929
2000-01-05 -1.509059 -0.173215 -0.861849  1.071804

若是上述函數當中的values參數被省略,獲得的dataframe就會有帶有層次化的列,列的頂層是帶每一個值列的列名,假如咱們如今有value1,value2兩列:變量

In [4]: df['value2'] = df['value'] * 2

In [5]: pivoted = df.pivot('date', 'variable')

In [6]: pivoted
Out[6]: 
               value                                  value2            \
variable           A         B         C         D         A         B   
date                                                                     
2000-01-03  0.469112 -1.135632  0.119209 -2.104569  0.938225 -2.271265   
2000-01-04 -0.282863  1.212112 -1.044236 -0.494929 -0.565727  2.424224   
2000-01-05 -1.509059 -0.173215 -0.861849  1.071804 -3.018117 -0.346429   

                                
variable           C         D  
date                            
2000-01-03  0.238417 -4.209138  
2000-01-04 -2.088472 -0.989859  
2000-01-05 -1.723698  2.143608

對於以上多層次列數據框,此時也能夠只顯示value2這一列:date

In [7]: pivoted['value2']
Out[7]: 
variable           A         B         C         D
date                                              
2000-01-03  0.938225 -2.271265  0.238417 -4.209138
2000-01-04 -0.565727  2.424224 -2.088472 -0.989859
2000-01-05 -3.018117 -0.346429 -1.723698  2.143608

可見pivot()函數是一個很是實用的,用來實現數據重塑的方法。方法

相關文章
相關標籤/搜索