我有一个带有多级列标题的数据框,如下所示:
AAPL US Equity A51 Index \ PX_LAST VOLATILITY_30D 3MTH_IMPVOL_100.0%MNY_DF PX_LAST date 2018-01-02 172.26 17.170 22.6288 148.450 2018-01-03 172.23 17.166 22.7465 146.025 2018-01-04 173.03 16.300 22.3322 144.700 AGN US Equity \ VOLATILITY_30D 3MTH_IMPVOL_100.0%MNY_DF PX_LAST date 2018-01-02 19.34 NaN 170.32 2018-01-03 20.30 NaN 170.14 2018-01-04 20.23 NaN 171.58 VOLATILITY_30D 3MTH_IMPVOL_100.0%MNY_DF date 2018-01-02 27.229 30.0374 2018-01-03 26.453 29.7482 2018-01-04 26.566 29.2898
当我使用时:
df = df.stack(0)
我注意到列标题与数据不对齐:
3MTH_IMPVOL_100.0%MNY_DF PX_LAST VOLATILITY_30D date 2018-01-02 AAPL US Equity NaN 148.450 19.340 A51 Index 22.6288 172.260 17.170 AGN US Equity 30.0374 170.320 27.229 2018-01-03 AAPL US Equity NaN 146.025 20.300 A51 Index 22.7465 172.230 17.166 AGN US Equity 29.7482 170.140 26.453 2018-01-04 AAPL US Equity NaN 144.700 20.230 A51 Index 22.3322 173.030 16.300 AGN US Equity 29.2898 171.580 26.566
如您所见,AAPL US Equity的PX_LAST值在2018年1月2日从初始数据帧开始为172.26,但在堆栈中显示为148.450。奇怪的是,直到(2018-10-15)之前的代码都没有以这种方式失败。我有一个不需要使用stack(0)的解决方案,但是我对为什么它不再起作用感到好奇,因为在Pandas中,stack是一种非常常见的数据处理用例。
编辑:更多细节,看来多索引标签是错误的:
MultiIndex(levels=[[u'AAPL US Equity', u'A51 Index', u'AGN US Equity'], [u'PX_LAST', u'VOLATILITY_30D', u'3MTH_IMPV OL_100.0%MNY_DF']],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])
这可能与我要从中提取数据的API相比,与Pandas有更多关系,因为第一个标签列表已排序,而第二个标签列表似乎已排序为单独的列表,然后进行了串联。我猜stack()引用这些标签来取消旋转数组