附加到数据帧的多索引并在pandas中重新堆叠

时间:2016-08-26 19:55:16

标签: python pandas

如何通过新索引列的排序顺序附加到数据框的多索引并重新打包?

我有一个带有多索引\n的数据框,它代表库中的书籍,如下所示:

['section_id','last_checkout']

所以 book_id author_id section_id last_checkout 4 2016-04-04 07:01:59.223 1 10 2016-04-04 07:01:59.223 2 11 2016-04-04 07:01:59.223 3 12 2016-04-04 07:01:59.233 4 13 2016-04-04 07:01:59.247 5 13 2016-04-04 07:01:59.253 6 14 5 2016-04-04 07:01:59.253 10 15 2016-04-04 07:01:59.268 11 10 1的图书在6部分。我计划在索引中添加另一列4

pd.Series({'floor': [1,1,2,1,2,3,4,1]})

在此之后,我希望逐层堆叠,同时保持已存在的顺序:

                                                 book_id   author_id  
section_id  floor  last_checkout
4           1      2016-04-04 07:01:59.223          1          10
            1      2016-04-04 07:01:59.223          2          11
            2      2016-04-04 07:01:59.223          3          12
            1      2016-04-04 07:01:59.233          4          13
            2      2016-04-04 07:01:59.247          5          13
            3      2016-04-04 07:01:59.253          6          14
5           4      2016-04-04 07:01:59.253          10         15
            1      2016-04-04 07:01:59.268          11         10

我认为它应该非常简单,但在尝试了各种不成功的排列后,API似乎不直观:

                                                 book_id   author_id  
section_id  floor  last_checkout
4           1      2016-04-04 07:01:59.223          1          10
            1      2016-04-04 07:01:59.223          2          11
            1      2016-04-04 07:01:59.233          4          13
5           1      2016-04-04 07:01:59.268          11         10
4           2      2016-04-04 07:01:59.223          3          12
            2      2016-04-04 07:01:59.247          5          13
            3      2016-04-04 07:01:59.253          6          14
5           4      2016-04-04 07:01:59.253          10         15

1 个答案:

答案 0 :(得分:0)

这是一个适合您的解决方案。

首先,你定义系列的方式非常不正统。最好将系列定义为:

test = pd.Series([1,1,2,1,2,3,4,1],name='floor')

然后获取您的多索引数据框并重置索引。要“追加”/垂直堆叠列,请使用“join”而不是“append”。所以这就是代码的样子

df = df.reset_index()
floor_series = pd.Series([1,1,2,1,2,3,4,1],name='floor')
df = df.join(test)
df = df.sort('floor')
df = df.set_index(['floor','section_id'])