如何替换多索引的第 n 级中所有等于 x 的值

How do I replace all values equal to x in nth level of a multi index

考虑 pd.Series s

s = pd.Series(np.arange(6),
              pd.MultiIndex.from_product([[1, 2], [1, 2, 3]]))

1  1    0
   2    1
   3    2
2  1    3
   2    4
   3    5
dtype: int64

我想将索引中 3 的所有值替换为 4


我刚想到这个,但我不喜欢它。

lvl0 = s.index.get_level_values(0)
lvl1 = s.index.get_level_values(1)

s.index = pd.MultiIndex.from_tuples(zip(lvl0, np.where(lvl1 == 3, 4, lvl1)))
s

1  1    0
   2    1
   4    2
2  1    3
   2    4
   4    5
dtype: int64

您可以使用 s.index.levels = [[1, 2], [1, 2, 4]] 但您可能会收到 FutureWarning:

FutureWarning: setting `levels` directly is deprecated. Use set_levels instead

所以你可以试试

>>> s.index = s.index.set_levels([[1, 2], [1, 2, 4]])
>>> s
  1  1    0
     2    1
     4    2
  2  1    3
     2    4
     4    5

你可以重置索引

s = s.reset_index()
s[s==3] = 4



In[227]: s
Out[227]: 
   level_0  level_1  0
0        1        1  0
1        1        2  1
2        1        4  2
3        2        1  4
4        2        2  4
5        2        4  5