从现有的 MultiIndex 级别值计算新的 MultiIndex 级别
Calculate new MultiIndex level from existing MultiIndex level values
对于具有两个 MultiIndex 级别 age
和 yearref
的 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
对于具有两个 MultiIndex 级别 age
和 yearref
的 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