You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确为带MultiIndex的Pandas DataFrame设置切片?

Pandas多索引DataFrame切片赋值的正确方法

问题说明

普通索引的DataFrame使用loc切片赋值时能正常匹配索引,但多索引场景下,直接通过单一层级索引赋值会因索引不匹配导致赋值失败,出现NaN结果。

普通索引正常示例

import pandas as pd

a = pd.DataFrame([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]], index=['a', 'b', 'c', 'd', 'e'], columns=['A', 'B'])
b = pd.Series([10], index=['c'])
a.loc['a':'c', 'A'] = b
print(a)

输出:

A    B
a   NaN  2.0
b   NaN  3.0
c  10.0  4.0
d   4.0  5.0
e   5.0  6.0

多索引赋值失败示例

d = pd.DataFrame([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [7, 8]], index=pd.MultiIndex.from_tuples([(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c')], names=['First', 'Second']), columns=['A', 'B'])
print(d)
#               A  B
# First Second      
# 1     a       1  2
#       b       2  3
#       c       3  4
# 2     a       4  5
#       b       5  6
#       c       7  8

d.loc[1, 'A'] = d.loc[2, 'A']
print(d)

#                 A  B
# First Second        
# 1     a       NaN  2
#       b       NaN  3
#       c       NaN  4
# 2     a       4.0  5
#       b       5.0  6
#       c       7.0  8

可行解决方案

1. 对齐赋值双方的索引

赋值失败的核心原因是右侧Series的索引((2, 'a'), (2, 'b'), (2, 'c'))与目标区域的索引((1, 'a'), (1, 'b'), (1, 'c'))不匹配,重新设置右侧Series的索引即可:

target_index = d.loc[1, 'A'].index
d.loc[1, 'A'] = d.loc[2, 'A'].set_axis(target_index)
print(d)

输出:

A  B
First Second      
1     a       4  2
      b       5  3
      c       7  4
2     a       4  5
      b       5  6
      c       7  8

2. 直接赋值底层数值数组

跳过Pandas的索引匹配逻辑,直接提取右侧的数值数组进行赋值:

d.loc[1, 'A'] = d.loc[2, 'A'].values
print(d)

此方法简洁高效,适合不需要保留索引的场景。

3. 精确指定多索引元组

通过元组形式明确指定每个多索引位置,逐个匹配赋值:

for sec in ['a', 'b', 'c']:
    d.loc[(1, sec), 'A'] = d.loc[(2, sec), 'A']
print(d)

这种方式逻辑清晰,适合需要自定义匹配规则的场景。

4. 使用.xs提取层级数据后赋值

利用.xs提取指定层级的切片,再完成赋值(同样需要跳过索引匹配或对齐索引):

d.xs(1, level='First')['A'] = d.xs(2, level='First')['A'].values
print(d)

内容的提问来源于stack exchange,提问作者stevew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:20:42