如何转移大熊猫MultiIndex系列?

时间:2012-10-23 12:17:56

标签: python time-series pandas

在常规时间序列中,您可以及时向前或向后移动。

e.g。对于以下时间序列:

start = datetime(2012,1,1)
end = datetime(2012,4,1)
rng = pd.date_range(start,end)
ts = pd.Series(np.random.randn(len(rng)), index = rng)

我们可以改为:

ts.shift(2, freq="D")

如何在一个级别上为MultiIndex时间序列执行此操作?

e.g。对于以下MultiIndex时间序列:

mi = [(dt,i) for dt in rng for i in range(5)]
ts_mi = pd.Series(np.random.randn(len(mi)), index = pd.MultiIndex.from_tuples(mi))

可能类似于:

2012-01-01  0   -0.805353
            1    1.467167
            2   -1.207204
            3    1.658394
            4    1.497559
2012-01-02  0   -0.742510
            1    0.764594
            2    0.558660
            3   -0.479370
            4    0.653849
...

使用ts_mi.shift(2, freq="D")移动它:

None   -0.805353
None    1.467167
None   -1.207204
None    1.658394
None    1.497559
None   -0.742510
None    0.764594
None    0.558660
None   -0.479370
None    0.653849
None   -0.138347
None    0.357479
None   -0.919202
None    1.300977
None   -0.360398
...

1 个答案:

答案 0 :(得分:4)

ts_mi.unstack().shift(2, freq='D').stack()

可以看出输出是正确的:

utils.side_by_side(ts_mi, ts_mi.unstack().shift(2, freq='D').stack())
2012-01-01  0    0.481555    2012-01-03  0    0.481555
            1    0.000628                1    0.000628
            2    2.509266                2    2.509266
            3    0.021571                3    0.021571
            4   -0.539981                4   -0.539981
2012-01-02  0   -1.465450    2012-01-04  0   -1.465450
            1    0.815251                1    0.815251
            2   -1.489051                2   -1.489051
            3    0.639746                3    0.639746
            4   -0.176939                4   -0.176939
2012-01-03  0   -0.441842    2012-01-05  0   -0.441842
            1   -0.792810                1   -0.792810
            2   -0.802665                2   -0.802665
            3    1.922190                3    1.922190
            4    0.165446                4    0.165446
...                          ...                      

工作原理:df.unstack()将嵌套的0,1,2,3,4中的值移动到谐音列,df.stack()恢复原始的嵌套索引。

编辑:这是@Wes_McKinney的side_by_side函数

def side_by_side(*objs, **kwds):
    from pandas.core.common import adjoin
    space = kwds.get('space', 4)
    reprs = [repr(obj).split('\n') for obj in objs]
    print adjoin(space, *reprs)