使用上一行值计算 Pandas MultiIndex DataFrame 中的下一个值

Use previous row value to calculate next value in Pandas MultiIndex DataFrame

所以答案接近我要找的东西,但我不能将它应用到 MultiIndex DataFrame.

我这样定义分层索引 Dataframe

arrays = [["bar", "bar"], ["one", "two"]]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])
np.random.seed(0)
df = pd.DataFrame(np.random.randn(4, 2), index=["A", "B", "C", "D"], columns=index)

输出:

first        bar             foo
second       one       two   one
A       1.764052  0.400157  None
B       0.978738  2.240893  None
C       1.867558 -0.977278  None
D       0.950088 -0.151357  None

我想按如下方式填充新的 df['foo'、'one'] 列:

最后的 table 应该是这样的:

first        bar             foo
second       one       two   one
A       1.764052  0.400157  100
B       0.978738  2.240893  276.4
C       1.867558 -0.977278  546.9
D       0.950088 -0.151357  1568.4

我面临的主要问题是访问 MultiIndex DataFrame 的行 idx。 df['foo', 'one'][0]=100 有效但会发出警告:"A value is trying to be set on a copy of a slice from a DataFrame".

并且 df.loc[0, 'bar', 'one'] 抛出 "Too many indexers"

您的索引不包含0,另外,将多索引作为元组

df.loc['A', ('bar', 'one')]

IIUC,你想要的是一个 cumprod ,你将值初始化为 100。剩下的只是索引:

START = 100
df[('foo', 'one')] = (df[('bar', 'one')]
                      .add(1)
                      .shift(fill_value=START)
                      .cumprod()
                      )

输出:

first        bar                    foo
second       one       two          one
A       1.764052  0.400157   100.000000
B       0.978738  2.240893   276.405235
C       1.867558 -0.977278   546.933537
D       0.950088 -0.151357  1568.363633
索引

独立于您的目标,要索引您需要使用的 MultiIndex:

df.loc['A', ('bar', 'one')]

或者,对于名称和相对索引的混合:

df[('bar', 'one')].iloc[0]