PYTHON PANDAS之数据重塑(Data Reshaping)
实际遇到的问题:
在CSV文件当中或者数据库当的数据通常以长格式或者(stacked)堆叠格式存储,特别是金融数据中出现的时间序列数据,例如:
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,即数据重塑,
选出变量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这一列:
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()函数是一个非常实用的,用来实现数据重塑的方法。
相关推荐
三石 2020-10-30
roamer 2020-10-29
三石 2020-10-29
wangquannuaa 2020-10-15
wangquannuaa 2020-09-29
jzlixiao 2020-09-15
wangquannuaa 2020-08-30
三石 2020-08-23
逍遥友 2020-08-21
jzlixiao 2020-08-18
wangquannuaa 2020-08-17
QianYanDai 2020-08-16
cjsyrwt 2020-08-14
jzlixiao 2020-07-29
xirongxudlut 2020-07-20
mmmjyjy 2020-07-16
QianYanDai 2020-07-05
QianYanDai 2020-07-05
june0 2020-07-04