Python 熊猫-为多索引系列设置新的索引级别
我有一个带有多索引的pandas系列,希望用单独列表中的值替换其中一个级别。我找到了一个解决方法来实现这一点,但我想知道是否有更直接的方法来实现这一点。这个问题还涉及到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
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'))
。有人能告诉我吗?如果您运行的是pandas0.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
。