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

Posted

技术标签:

【中文标题】如何在多索引的第 n 级替换所有等于 x 的值【英文标题】:How do I replace all values equal to x in nth level of a multi index 【发布时间】:2017-02-03 05:42:19 【问题描述】:

考虑pd.Seriess

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

我想用4 替换索引中3 的所有值。


我只是想出了这个,我不喜欢它。

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

【问题讨论】:

【参考方案1】:

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

FutureWarning:不推荐直接设置 `levels`。使用 set_levels 而是

所以你可以试试

>>> 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

【讨论】:

【参考方案2】:

你可以重置索引

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

【讨论】:

以上是关于如何在多索引的第 n 级替换所有等于 x 的值的主要内容,如果未能解决你的问题,请参考以下文章

如何更改熊猫数据框中多索引的外层索引?

将具有多索引的一个 DF 中的值除以另一个 DF 中的值并绘制结果

如何在熊猫中使用具有多索引的地图?

如何修改boost多索引的只读元素?

Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?

如何在熊猫中获得多级 x 轴标记图?