pandas - 为multiindex系列设置新的索引级别

时间:2015-05-05 12:42:20

标签: python pandas replace multi-index

我有一个带有MultiIndex的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

>>> RepNum[:7]
['2013_x', '4135_y', '7881_x', '7890_x', '9067_z', '9233_w', '5378_y']

我希望用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'))时获得了相同的错误结果。有人可以启发我吗?

0 个答案:

没有答案