将多个索引级别添加到现有的熊猫索引

时间:2020-06-19 08:41:45

标签: pandas multi-index

我有一个带有常规日期时间索引的df。我需要添加多个索引级别。实现这一目标的Python方法是什么?

import numpy as np
import pandas as pd

idx = pd.date_range(start="2020-01-01", end="2020-01-10")
vals = {"values": np.random.randint(low=1, high=100, size=10)}
df = pd.DataFrame(data=vals, index=idx)
df.index.name = "time"

例如,我需要添加两个新的索引级别。它们必须在当前索引级别“时间”之前。结果应如下所示。

                              values
L0_name  L1_name  time              
L0 value L1 value 2020-01-01      87
                  2020-01-02      46
                  2020-01-03      19
                  2020-01-04      44
                  2020-01-05      94
                  2020-01-06      58
                  2020-01-07      74
                  2020-01-08      32
                  2020-01-09      64
                  2020-01-10      84

1 个答案:

答案 0 :(得分:2)

通过DataFrame.assign创建新列,通过DataFrame.set_index附加到现有索引,然后通过DataFrame.reorder_levels更改其顺序:

df1 = (df.assign(L0_name = 'L0 value', L1_name='L1 value')
         .set_index(['L0_name','L1_name'], append=True)
         .reorder_levels([1,2,0]))

或创建新的MultiIndex,例如MultiIndex.from_product之前的值,并用DataFrame.set_index覆盖现有的索引:

idx = pd.MultiIndex.from_product([['L0 value'],['L1 value'], df.index], 
                                 names=['L0_name','L1_name','time'])

df1 = df.set_index(idx)

print (df1)
                              values
L0_name  L1_name  time              
L0 value L1 value 2020-01-01      84
                  2020-01-02      31
                  2020-01-03       4
                  2020-01-04      49
                  2020-01-05      77
                  2020-01-06      49
                  2020-01-07      15
                  2020-01-08      24
                  2020-01-09      49
                  2020-01-10      62