Python 熊猫-为多索引系列设置新的索引级别

Python 熊猫-为多索引系列设置新的索引级别,python,pandas,replace,multi-index,Python,Pandas,Replace,Multi Index,我有一个带有多索引的pandas系列,希望用单独列表中的值替换其中一个级别。我找到了一个解决方法来实现这一点,但我想知道是否有更直接的方法来实现这一点。这个问题还涉及到set_levels()的工作,我似乎不理解这一点 这是我的系列 >>> res name StringNum A 2013 3203 4135 579 7881 30600 789

我有一个带有多索引的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_数组([res.index.get_level_values('name').tolist(),RepNum],names=('name','number'))
。有人能告诉我吗?

如果您运行的是pandas
0.15.0
或更高版本,那么这会起作用:
res.index.set_levels(RepNum,level=1,inplace=True)
我认为这里的问题是您需要再次将级别值配对,以便生成级别0和级别1索引值,您可以重置级别索引,重命名并重新设置是可能的幸运的是,我必须使用pandas 0.13.x。但是你是对的,
res.reset_index(level=1,inplace=True)
res['StringNum']=RepNum
,然后
res.set_index('StringNum',append=True)
也会这样做,我更喜欢这个外观。对我自己的评论进行一次更正。我必须写
res=res.reset\u索引(级别=1)
inplace=True
在这里不起作用,因为显然不能简单地用数据帧替换一个序列,而数据帧的结果是调用
reset\u index