又一个重塑问题

时间:2015-03-20 21:50:39

标签: python pandas

我有一个数据框,其编入索引statusdate。大多数变量都适用于statusdate,但superDuper仅适用于date,每个状态都相同:

                    t070199   t070299   t070201   t070105  superDuper  
date       status                                                       
2003-01-01 foo     0.137684  0.032750  1.729324  4.484633  481.329224   
           fubar   1.348261  0.000000  0.159443  0.636001  481.329224   
2005-01-01 foo     0.038752  0.006538  1.341507  3.518619  474.549400   
           fubar   0.000000  0.000000  0.000000  8.457774  474.549400   
2007-01-01 foo     0.000000  0.097280  3.639593  1.901233  459.767016

如果我df.unstack(level='status'),我会得到一些

的内容
             t070199             t070299       superDuper             t070105  \
status           foo     fubar       foo fubar       foo     fubar       emp   
date                                                                           
2003-01-01  0.137684  1.348261  0.032750     0  1.729324  1.729324  4.484633   
2005-01-01  0.038752  0.000000  0.006538     0  1.341507  1.341507  3.518619   
2007-01-01  0.000000  0.000000  0.097280     0  3.639593  3.639593  1.901233   
2009-01-01  0.010630  0.000000  0.000000     0  1.840457  1.840457  2.728080   
2011-01-01  0.013474  0.000000  0.000000     0  2.020553  1.739148  1.320693   

也就是说,第一个级别包含txxxxsuperDuper列,对于每个列,我们有两列的子列。

我想重塑数据,以便我有以下第一级列:

[`t070199`, `t070299`, `t070201`, `t070105`]

对于每个顶级列,我想有3个子列:

['foo', 'bar', 'superDuper']

然后作为索引,只有date。由于superDuper并非特定于txxxx列,因此这可能意味着重复该列。 pivot并没有让我到那里,因为它不是一个子图层,unstack()可能也没有做到这一点。我可以尝试什么方法?

1 个答案:

答案 0 :(得分:3)

让我们从您的数据框开始:

                    t070199   t070299   t070201   t070105  superDuper
date       status                                                    
2003-01-01 foo     0.137684  0.032750  1.729324  4.484633  481.329224
           bar     1.348261  0.000000  0.159443  0.636001  481.329224
2005-01-01 foo     0.038752  0.006538  1.341507  3.518619  474.549400
           bar     0.000000  0.000000  0.000000  8.457774  474.549400
2007-01-01 foo     0.000000  0.097280  3.639593  1.901233  459.767016

弹出superDuper并保存以供日后使用。现在你可以使用unstack了。

>>> sd = df.pop("superDuper")
>>> df = df.unstack()
             t070199             t070299             t070201            \
status           bar       foo       bar       foo       bar       foo   
date                                                                     
2003-01-01  1.348261  0.137684  0.000000  0.032750  0.159443  1.729324   
2005-01-01  0.000000  0.038752  0.000000  0.006538  0.000000  1.341507   
2007-01-01       NaN  0.000000       NaN  0.097280       NaN  3.639593   

             t070105            
status           bar       foo  
date                            
2003-01-01  0.636001  4.484633  
2005-01-01  8.457774  3.518619  
2007-01-01       NaN  1.901233

获取唯一的superDuper值:

>>> sd = sd.reset_index(level="status", drop=True).drop_duplicates()
date
2003-01-01    481.329224
2005-01-01    474.549400
2007-01-01    459.767016
Name: superDuper, dtype: object

现在,我将假设您想要每个txxxx的superDuper子列。你的问题并不是很清楚这是真的还是你刚刚辞职。

您可以使用dict理解来获取新列。

>>> new = pd.DataFrame({(col, sd.name): sd for col in
                  df.columns.get_level_values(0)})

               t070105     t070199     t070201     t070299
            superDuper  superDuper  superDuper  superDuper
date                                                      
2003-01-01  481.329224  481.329224  481.329224  481.329224
2005-01-01  474.549400  474.549400  474.549400  474.549400
2007-01-01  459.767016  459.767016  459.767016  459.767016

现在只需加入并排序:

>>>df.join(new).sort(axis=1)
             t070105                         t070199                        \
status           bar       foo  superDuper       bar       foo  superDuper   
date                                                                         
2003-01-01  0.636001  4.484633  481.329224  1.348261  0.137684  481.329224   
2005-01-01  8.457774  3.518619  474.549400  0.000000  0.038752  474.549400   
2007-01-01       NaN  1.901233  459.767016       NaN  0.000000  459.767016   

             t070201                         t070299                        
status           bar       foo  superDuper       bar       foo  superDuper  
date                                                                        
2003-01-01  0.159443  1.729324  481.329224  0.000000  0.032750  481.329224  
2005-01-01  0.000000  1.341507  474.549400  0.000000  0.006538  474.549400  
2007-01-01       NaN  3.639593  459.767016       NaN  0.097280  459.767016