使用多级索引更新Pandas Series

后端开发 2026-07-12

我正在尝试用一个具有相同索引的Series来更新一个带有多级索引的Series的子集(见下方的最简可运行示例MWE)。我有一个方法,尽管在我看来应该可以工作,但它并没有起作用。我有一个慢方法,它确实能工作。还有一个快速的方法也能工作,但会抛出一个警告。

我想在内置方法的基础上使用快速方法,因为循环太耗时。

有没有人知道一个好的变通方法,或者对pandas方法的正确用法?

import pandas as pd

j = 0

I = range(1)
J = range(2)
K = range(3)
mi_ijk = pd.MultiIndex.from_product([I, J, K], names=['i', 'j', 'k'])
mi_ik = pd.MultiIndex.from_product([I, K], names=['i', 'k'])
s0_ijk = pd.Series(0, index=mi_ijk)
s1_ik = pd.Series(1, index=mi_ik)


# does not work
s0_ijk[:, j].update(s1_ik)
print(s0_ijk.sum())

# does work, but slow
for (i, k) in s1_ik.index:
    s0_ijk[i, j, k] = 1
print(s0_ijk.sum())

# does work but warning
s0_jik = s0_ijk.reorder_levels(['j', 'i', 'k'])
s0_jik[j].update(s1_ik)
s0_ijk = s0_jik.reorder_levels(['i', 'j', 'k'])
print(s0_ijk.sum())

解决方案

你可以使用 pd.IndexSlice 来进行多级索引切片:

i_lvl = s1_ik.index.get_level_values('i')
k_lvl = s1_ik.index.get_level_values('k')
idx = pd.IndexSlice[i_lvl, j, k_lvl]

s0_ijk.loc[idx] = s1_ik

输出:

>>> s0_ijk
i  j  k
0  0  0    1
      1    1
      2    1
   1  0    0
      1    0
      2    0
dtype: int64
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章