Stackoverflow問題:
在CSV文件當(dāng)中或者數(shù)據(jù)庫當(dāng)?shù)臄?shù)據(jù)通常以長格式或者(stacked)堆疊格式存儲,特別是金融數(shù)據(jù)中出現(xiàn)的時間序列數(shù)據(jù),例如:
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同時進(jìn)行時間序列分析時,這個需求特別強(qiáng)烈。
解決方案:
這里引出一個重要的概念,data reshaping,即數(shù)據(jù)重塑,
選出變量A的所有數(shù)據(jù)我們只需要如下操作,然后分別選出B,C,D,然后再再水平方向進(jìn)行concat操作,這樣當(dāng)然也可以得到指定的數(shù)據(jù)框,但這樣無疑編寫、執(zhí)行效率都有點(diǎn)低:
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
但是如果我們希望對變量進(jìn)行時間序列操作,那么我們可能將需要將每個變量單獨(dú)作為一列來表示,因此需要使用pivot()函數(shù)對數(shù)據(jù)進(jìn)行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
如果上述函數(shù)當(dāng)中的values參數(shù)被省略,得到的dataframe就會有帶有層次化的列,列的頂層是帶每個值列的列名,假如我們現(xiàn)在有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
對于以上多層次列數(shù)據(jù)框,此時也可以只顯示value2這一列:
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()函數(shù)是一個非常實(shí)用的,用來實(shí)現(xiàn)數(shù)據(jù)重塑的方法。