我有一个带有常规日期时间索引的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
答案 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