如何使用Python动态添加任意数量的值到pandas多重索引中的特定级别?

问题描述 投票:0回答:1

我有这个

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
并设置新索引,但这比我使用切片选项寻找的工作量要多一些。

还有其他人有什么想法吗?蒂亚!

python pandas multi-index
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.