仅重新索引MultiIndex数据帧的级别,reindex()损坏了?

时间:2019-12-24 16:17:26

标签: python pandas

我尝试仅在一个级别上对具有两个或多个索引的数据帧重新索引,但是将.reindex()level参数一起使用,正如我在this answer中看到的那样,似乎什么也没有做预期行为。

这是我尝试制作的代码:

import pandas as pd

dtest = pd.DataFrame([['Martin', 'room_1', 3],
                      ['Martin', 'room_2', 2],
                      ['Georges', 'room_2', 4],
                      ['Georges', 'room_1', 12]],
                     columns=['name', 'room', 'time_spent'])
dtest.set_index(['name', 'room',], inplace=True)
display(dtest)
print(dtest.reindex(
    ['room_1', 'room_2', 'room_3'], level=1, fill_value=0))

输出

                time_spent
name    room              
Martin  room_1           3
        room_2           2
Georges room_1          12
        room_2           4

我期望的输出是

                time_spent
name    room              
Martin  room_1           3
        room_2           2
        room_3           0
Georges room_1          12
        room_2           4
        room_3           0

reindex()实际上什么也没做。

我是否错过了使用reindex的重要细节,还是有什么问题?

我正在使用Python 3.6.7的最新版本的熊猫(v3.6.7:6ec5cf24b7,2018年10月20日,03:02:14)。

1 个答案:

答案 0 :(得分:1)

您将需要使用pd.MultiIndex.from_product()get_level_values为此创建一个多索引:

mux=(pd.MultiIndex.from_product((dtest.index.get_level_values(0).unique()
                             ,['room_1', 'room_2', 'room_3'])))
final=dtest.reindex(mux,fill_value=0)

                time_spent
Martin  room_1           3
        room_2           2
        room_3           0
Georges room_1          12
        room_2           4
        room_3           0

如果您只想添加带有现有索引的另一个索引,请在from_product() arg中使用Index.union

mux=(pd.MultiIndex.from_product((dtest.index.get_level_values(0).unique()
        ,dtest.index.get_level_values(1).unique().union(['room3'],sort=False))))
final=dtest.reindex(mux,fill_value=0)

                time_spent
Martin  room_1           3
        room_2           2
        room_3           0
Georges room_1          12
        room_2           4
        room_3           0

使用stack()添加另一个方法,并使用unstack()添加swaplevel

final=dtest.unstack(0).reindex(['room_1', 'room_2', 'room_3']
                     ,fill_value=0).stack().swaplevel().sort_index()

                time_spent
name    room              
Georges room_1          12
        room_2           4
        room_3           0
Martin  room_1           3
        room_2           2
        room_3           0