這個SO 答案接近我正在尋找的,但我不能將它應用于 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)
- 等等。
決賽桌應如下所示:
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 的行 idx DataFrame。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"
uj5u.com熱心網友回復:
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]
uj5u.com熱心網友回復:
您的索引不包括0,也將多索引作為元組
df.loc['A', ('bar', 'one')]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/444548.html
標籤:python-3.x 熊猫 迭代 多指标
上一篇:使用R的“mutate(across(cols=...”)在python中的列上添加ntiles
下一篇:承諾中的最終執行順序()
