Python 不同版本之间的多索引/重塑差异

Python 不同版本之间的多索引/重塑差异,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个使用以下代码的数据帧: import pandas as pd import numpy as np index = pd.DatetimeIndex(['2017-05-04', '2017-05-05', '2017-05-08', '2017-05-09', '2017-05-10'], dtype='datetime64[ns]',name = 'date', freq='B') columns = pd.MultiIndex(levels=[['HSB

我有一个使用以下代码的数据帧:

import pandas as pd
import numpy as np


index = pd.DatetimeIndex(['2017-05-04', '2017-05-05', '2017-05-08', '2017-05-09',
           '2017-05-10'], dtype='datetime64[ns]',name = 'date', freq='B')
columns = pd.MultiIndex(levels=[['HSBA LN Equity', 'UCG IM Equity', 'ISP IM Equity'], ['LAST PRICE', 'HIGH', 'LOW']],
       labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])
data = np.array([[ 663.8, 672.5, 661.1, 15.97, 16.02, 15.49, 2.76, 2.768, 2.694],
          [ 658.6, 663.9, 656.0, 16.22, 16.48, 15.77, 2.842, 2.868, 2.77 ],
          [ 660.6, 664.1, 658.9, 16.01, 16.49, 15.94, 2.852, 2.898, 2.826],
          [ 664.9, 669.2, 662.5, 15.90, 16.41, 15.90, 2.848, 2.898, 2.842],
          [ 670.9, 673.4, 663.8, 16.09, 16.15, 15.59, 2.85,  2.888, 2.802]])
df = pd.DataFrame(data, columns=columns, index = index)
输出如下所示:

            HSBA LN Equity               UCG IM Equity                \
            LAST PRICE   HIGH    LOW    LAST PRICE   HIGH    LOW   
date                                                                  
2017-05-04          663.8  672.5  661.1         15.97  16.02  15.49   
2017-05-05          658.6  663.9  656.0         16.22  16.48  15.77   
2017-05-08          660.6  664.1  658.9         16.01  16.49  15.94   
2017-05-09          664.9  669.2  662.5         15.90  16.41  15.90   
2017-05-10          670.9  673.4  663.8         16.09  16.15  15.59   

       ISP IM Equity                
          LAST PRICE   HIGH    LOW  
date                                    
2017-05-04         2.760  2.768  2.694  
2017-05-05         2.842  2.868  2.770  
2017-05-08         2.852  2.898  2.826  
2017-05-09         2.848  2.898  2.842  
2017-05-10         2.850  2.888  2.802  
                              HIGH  LAST PRICE      LOW
date                                                   
2017-05-04 HSBA LN Equity  672.500     663.800  661.100
           UCG IM Equity     2.768       2.760    2.694
           ISP IM Equity    16.020      15.970   15.490
2017-05-05 HSBA LN Equity  663.900     658.600  656.000
           UCG IM Equity     2.868       2.842    2.770
           ISP IM Equity    16.480      16.220   15.770
2017-05-08 HSBA LN Equity  664.100     660.600  658.900
           UCG IM Equity     2.898       2.852    2.826
           ISP IM Equity    16.490      16.010   15.940
2017-05-09 HSBA LN Equity  669.200     664.900  662.500
           UCG IM Equity     2.898       2.848    2.842
           ISP IM Equity    16.410      15.900   15.900
2017-05-10 HSBA LN Equity  673.400     670.900  663.800
           UCG IM Equity     2.888       2.850    2.802
           ISP IM Equity    16.150      16.090   15.590
当我使用
df=df.stack(0)
时,从
0.19.2
升级到
0.20.1
,输出如下:

            HSBA LN Equity               UCG IM Equity                \
            LAST PRICE   HIGH    LOW    LAST PRICE   HIGH    LOW   
date                                                                  
2017-05-04          663.8  672.5  661.1         15.97  16.02  15.49   
2017-05-05          658.6  663.9  656.0         16.22  16.48  15.77   
2017-05-08          660.6  664.1  658.9         16.01  16.49  15.94   
2017-05-09          664.9  669.2  662.5         15.90  16.41  15.90   
2017-05-10          670.9  673.4  663.8         16.09  16.15  15.59   

       ISP IM Equity                
          LAST PRICE   HIGH    LOW  
date                                    
2017-05-04         2.760  2.768  2.694  
2017-05-05         2.842  2.868  2.770  
2017-05-08         2.852  2.898  2.826  
2017-05-09         2.848  2.898  2.842  
2017-05-10         2.850  2.888  2.802  
                              HIGH  LAST PRICE      LOW
date                                                   
2017-05-04 HSBA LN Equity  672.500     663.800  661.100
           UCG IM Equity     2.768       2.760    2.694
           ISP IM Equity    16.020      15.970   15.490
2017-05-05 HSBA LN Equity  663.900     658.600  656.000
           UCG IM Equity     2.868       2.842    2.770
           ISP IM Equity    16.480      16.220   15.770
2017-05-08 HSBA LN Equity  664.100     660.600  658.900
           UCG IM Equity     2.898       2.852    2.826
           ISP IM Equity    16.490      16.010   15.940
2017-05-09 HSBA LN Equity  669.200     664.900  662.500
           UCG IM Equity     2.898       2.848    2.842
           ISP IM Equity    16.410      15.900   15.900
2017-05-10 HSBA LN Equity  673.400     670.900  663.800
           UCG IM Equity     2.888       2.850    2.802
           ISP IM Equity    16.150      16.090   15.590
这些列的顺序已经改变,股票价格不再与正确的股票价格匹配


这是一个bug吗?

这肯定是一个bug,因为我的两个团队大量使用多索引列和堆栈,所以有点可怕。在你的文章中找到它并做了一个PR()


这已经合并到master中,并将成为0.20.2错误修复版本的一部分,目前计划于2017年6月13日发布

谢谢你的检查。我仍然有这个问题。我想知道我的数据框是否有什么奇怪的地方。是的,这对我来说就像一个bug。还有一个坏的-(很高兴听到。感谢您的修复和跟进!@DSM…我注意到pandas dev上的堆栈和多索引仍然存在问题。与排序有关吗?这也是一个错误吗?它们是否相关?