我有这个
dataframe
,其中有一个 MultiIndex
对象作为其 index
。
apple
level_1 level_2 level_3 level_4 level_5
bga B G 1 0 5.0
如何动态添加随机数量的值到第 5 级?
我有这个:
randData = ["r1", "r13", "r14", "r6"]
for x in randData:
df.loc[( "bga", "B", "G", "1", x ), "apple"] = np.random.randn(1)[0]
这很有效,但对于超过 4 个项目的列表则需要很长时间。我正在考虑这样一个简单的片段:
df.loc[( "bga", "B", "G", "1" ), "apple"] = (randData, np.random.randn(4))
但它不喜欢那样(这是有道理的),而且我想不出任何其他方式来分割它,让我可以向关卡添加值。
我想过简单地重新创建
MultiIndex
并设置新索引,但这比我使用切片选项寻找的工作量要多一些。
还有其他人有什么想法吗?蒂亚!
MultiIndex 似乎会减慢您的速度。在内部,我们将这些视为元组(我相信)。因为在这里你想要做一些并行化,所以我建议
.reset_index
这样级别就变成了列。然后你就可以在那里大惊小怪了。
我使用了
pd.concat
来填充 NaN
那些我们没有指定的条目。然后可以使用 fillna
和 ffill
来复制上面的条目。
代码:
x = pd.DataFrame({'apple': 5.0}, index=pd.MultiIndex.from_tuples([( "bga", "B", "G", 1, 0)]))
print(x)
y = x.reset_index()
print(y)
z = pd.DataFrame({'level_4': ['r1', 'r13', 'r14', 'r16'], 'apple': np.random.randn(4)})
print(z)
w = pd.concat([y, z])
print(w)
u = w.fillna(method='ffill')
print(u)
v = u.set_index(['level_0', 'level_1', 'level_2', 'level_3', 'level_4'])
print(v)
输出:
apple
bga B G 1 0 5.0
level_0 level_1 level_2 level_3 level_4 apple
0 bga B G 1 0 5.0
level_4 apple
0 r1 0.286195
1 r13 -0.039496
2 r14 -0.571542
3 r16 1.196218
level_0 level_1 level_2 level_3 level_4 apple
0 bga B G 1.0 0 5.000000
0 NaN NaN NaN NaN r1 0.286195
1 NaN NaN NaN NaN r13 -0.039496
2 NaN NaN NaN NaN r14 -0.571542
3 NaN NaN NaN NaN r16 1.196218
level_0 level_1 level_2 level_3 level_4 apple
0 bga B G 1.0 0 5.000000
0 bga B G 1.0 r1 0.286195
1 bga B G 1.0 r13 -0.039496
2 bga B G 1.0 r14 -0.571542
3 bga B G 1.0 r16 1.196218
apple
level_0 level_1 level_2 level_3 level_4
bga B G 1.0 0 5.000000
r1 0.286195
r13 -0.039496
r14 -0.571542
r16 1.196218