Pandas为多指数系列设定了新的指数级别

2024-06-16 12:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有多索引的pandas系列,希望用单独列表中的值替换其中一个级别。我找到了一个解决方法,但是我想知道是否有更直接的方法来实现这一点。这个问题还涉及set_levels()的工作,我似乎不明白。在

这是我的系列

>>> res
name     StringNum
A         2013         3203
          4135          579
          7881        30600
          7890          575
          9067        30600
          9233        30600
B         5378        30600
          7881        30600
C         5121        30600
...
N         9895         3935
U         1270        30600
          3049        30600
Length: 4213, dtype: float64

我有一个清单RepNum

^{pr2}$

我想用StringNum的索引值替换哪些值。 现在我实现如下目标

newres = pd.concat([res,pd.Series(res.index.get_level_values('name').tolist(),index=res.index),pd.Series(RepNum,index=res.index)],axis=1)
newres.set_index([1,2],inplace=True)
newres.index.names = ['name','StringNum']
>>> newres
                  0
name     StringNum            
A        2013_x   3203
         4135_y    579
         7881_x  30600
         7890_x    57
         9067_z  30600
         9233_w  30600
B        5378_y  30600
         7881_y  30600
C        5121_z  30600
...

这就是我想要的。不过,我本以为res.index.set_levels([res.index.get_level_values('name').tolist(),RepNum],inplace=True)会以一种更优雅、更实用的方式来完成相同的操作,但是结果序列显示了错误的索引值到相应的列条目

name     StringNum     
A        7890_x     3203
         9147_b      579
         5113_x    30600
         5134_v      575
         7289_w    30600
         9543_b    30600
         9895_y    30600
         5113_x    30600
         7003_v    30600
         9067_z      624
         7804_w    30600
...

您还可以看到name A现在有比实际更多的条目(A在原始系列中只有6个条目)。顺便说一句,尝试res = pd.Series(res.values, index=NewIndex)也会得到同样的错误结果,其中NewIndex = pd.MultiIndex.from_arrays([res.index.get_level_values('name').tolist(),RepNum], names=('name','number'))。有人能开导我吗?在


Tags: 方法namegetindex条目reslevelseries