使用上一行值计算 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'] 列:
- 我希望第一行 n 为 100。
- 我希望第 n+1 行是:n * (df['bar', 'one'][n] + 1)
- 以此类推
最后的 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]
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'] 列:
- 我希望第一行 n 为 100。
- 我希望第 n+1 行是:n * (df['bar', 'one'][n] + 1)
- 以此类推
最后的 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]