从现有的 MultiIndex 级别值计算新的 MultiIndex 级别

Calculate new MultiIndex level from existing MultiIndex level values

对于具有两个 MultiIndex 级别 ageyearref 的 DataFrame,目标是添加一个新的 MultiIndex 级别 yearconstr,计算为 yearconstr = yearref - age

import pandas as pd

df = pd.DataFrame({"value": [1, 2, 3]}, 
                  index=pd.MultiIndex.from_tuples([(10, 2015), (3, 2015), (2, 2016)], 
                                                  names=["age", "yearref"]))
print(df)

# input df:
             value
age yearref       
10  2015         1
3   2015         2
2   2016         3

我们可以重置索引,计算一个新列,然后将原始索引和新定义的列放回原处,但肯定有更好的方法。

df = (df.reset_index()
        .assign(yearconstr=lambda df: df.yearref - df.age)
        .set_index(list(df.index.names) + ["yearconstr"]))

print(df)

# expected result:
                        value
age yearref yearconstr       
10  2015    2005            1
3   2015    2012            2
2   2016    2014            3

为了简洁straight-forward的方法,我们可以使用

  • eval 生成从现有 MultiIndex 计算的新系列。这很容易,因为它像对待列一样对待索引级别:df.eval("yearref - age")
  • rename新系列
  • set_index 使用 append=True 参数将系列附加到 df

把所有东西放在一起:

df.set_index(df.eval("yearref - age").rename("yearconstr"), append=True)

# result:
                        value
age yearref yearconstr       
10  2015    2005            1
3   2015    2012            2
2   2016    2014            3