Python 将列设置为列的第二个索引

Python 将列设置为列的第二个索引,python,pandas,Python,Pandas,我有一个多索引数据框,看起来像这样 Pool Lab_ID Units ... CV% CV SEM Analysis_panel analyte ... OXID F2A12I A M ng/mL ... 6.111037 0.061110

我有一个多索引数据框,看起来像这样

                       Pool Lab_ID    Units  ...        CV%        CV        SEM
Analysis_panel analyte                       ...                                
OXID           F2A12I     A   M       ng/mL  ...   6.111037  0.061110   0.098823
               F2A12I     B   M       ng/mL  ...   3.620595  0.036206   0.050259
               F2A23D     A   N       ng/mL  ...   6.631863  0.066319   0.020186
               F2A23D     B   N       ng/mL  ...   6.150949  0.061509   0.021566
               F2A8IP     B   M       ng/mL  ...   2.227108  0.022271   0.002000
                    ...    ...      ...  ...        ...       ...        ...
VOCs           HPMA       B   N       pmol/mL  ...   4.444958  0.044450  27.313001
               HPMA2      A   N       pmol/mL  ...  14.437254  0.144373  16.838646
               HPMA2      B   M       pmol/mL  ...  15.010317  0.150103  21.588423
               SPMA       A   M       pmol/mL  ...  12.959157  0.129592   0.041438
               SPMA       B   N       pmol/mL  ...  11.961421  0.119614   0.054991

[276 rows x 11 columns]

我想将Lab_ID列设置为另一个排序的列索引——我希望我的最终df的结构如下

                                M                        N
                       Pool   Units  ... SEM    Pool   Units  ... SEM
Analysis_panel analyte                                                     
OXID           F2A12I     
               F2A12I     
               F2A23D     
               F2A23D    
               F2A8IP     
                    ...    ...      ...  ...      ...       ...        ...
VOCs           HPMA       
               HPMA2      
               HPMA2      
               SPMA       
               SPMA       

有没有一种简单的方法可以做到这一点?

这会起作用,但不会产生准确的预期输出:

(df.set_index(['Pool', 'Lab_ID'], append=True)
   .unstack('Lab_ID')
)
输出:

                               Units                  CV%              \
Lab_ID                             M        N           M           N   
Analysis_panel analyte Pool                                             
OXID           F2A12I  A       ng/mL      NaN   6111037.0         NaN   
                       B       ng/mL      NaN   3620595.0         NaN   
               F2A23D  A         NaN    ng/mL         NaN   6631863.0   
                       B         NaN    ng/mL         NaN   6150949.0   
               F2A8IP  B       ng/mL      NaN   2227108.0         NaN   
VOCs           HPMA    B         NaN  pmol/mL         NaN   4444958.0   
               HPMA2   A         NaN  pmol/mL         NaN  14437254.0   
                       B     pmol/mL      NaN  15010317.0         NaN   
               SPMA    A     pmol/mL      NaN  12959157.0         NaN   
                       B         NaN  pmol/mL         NaN  11961421.0   

                                   CV                   SEM              
Lab_ID                              M         N           M           N  
Analysis_panel analyte Pool                                              
OXID           F2A12I  A      61110.0       NaN     98823.0         NaN  
                       B      36206.0       NaN     50259.0         NaN  
               F2A23D  A          NaN   66319.0         NaN     20186.0  
                       B          NaN   61509.0         NaN     21566.0  
               F2A8IP  B      22271.0       NaN      2000.0         NaN  
VOCs           HPMA    B          NaN   44450.0         NaN  27313001.0  
               HPMA2   A          NaN  144373.0         NaN  16838646.0  
                       B     150103.0       NaN  21588423.0         NaN  
               SPMA    A     129592.0       NaN     41438.0         NaN  
                       B          NaN  119614.0         NaN     54991.0  

df.pivot(columns='Lab_ID')
?哎呀,我还以为你是想把它设置为索引,而不是列索引。@cs95将
Lab_ID
添加到索引中,取消堆栈可能会比pivot提供更好的性能。@QuangHoang我怀疑取消堆栈会提供更好的性能,但两者都是好的、简洁的选项!我最近一直在玩pivot代码。基本上,stack和groupby并尝试覆盖很多边缘情况。所以我说了,虽然现在不能测试它。