堆叠和卸垛

时间:2015-03-20 17:08:27

标签: python pandas

我有一个月度状态索引的数据框:

                            var1          var2
      date status                            
2003-01-01  foo     5.673044e+12  1.412815e+10
            fubar   5.102315e+11  1.226870e+09
2003-02-01  foo     4.058879e+12  1.092852e+10
            fubar   5.761504e+11  1.745472e+09
2003-03-01  foo     6.238392e+12  1.343086e+10

我想加入包含VALUE的df只是特定于日期的。所以我做了

df = df.unstack(level='status')
test = df.join(otherDf, how='left')

哪个按预期工作,现在我有:

             (var1, foo)  (var1, fubar)   (var2, foo)  (var2, fubar)  VALUE
date                                                                       
2003-01-01  5.673044e+12   5.102315e+11  1.412815e+10   1.226870e+09   68.9
2003-02-01  4.058879e+12   5.761504e+11  1.092852e+10   1.745472e+09   69.2
2003-03-01  6.238392e+12   8.801683e+11  1.343086e+10   1.165204e+09   68.9
2003-04-01  6.077365e+12   7.515224e+11  1.228901e+10   1.315599e+09   69.0
2003-05-01  6.924681e+12   6.021974e+11  1.358737e+10   1.171898e+09   68.8

但是现在我遇到了将其恢复原始格式的问题:

我天真地试过test.stack(level='status'),这给了我

KeyError: 'Level status must be same as name (None)'

我认为问题是VALUE没有上限。 manual中没有描述类似的操作。有没有办法只将stack应用于某些列?

我的预期输出是

                    var                  VALUE
      date  status                            
2003-01-01  foo     5.673044e+12  1.412815e+10   
            fubar   5.102315e+11  1.412815e+10   
2003-02-01  foo     4.058879e+12  1.092852e+10   
            fubar   5.761504e+11  1.092852e+10   
2003-03-01  foo     6.238392e+12  1.343086e+10

1 个答案:

答案 0 :(得分:1)

首先不要拆开:

#df = df.unstack(level='status')
test = df.join(otherDf)

join()足够聪明,可以将otherDf中的索引与df中的大量索引进行匹配,而无需您进行拆分和重新堆叠。