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