使用多级索引更新Pandas Series
我正在尝试用一个具有相同索引的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。