實際遇到的問題:數據庫
在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()函數是一個很是實用的,用來實現數據重塑的方法。方法