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

Pandas:如何将单索引DataFrame列赋值给多索引DataFrame

这个问题我之前也踩过坑,本质是Pandas索引对齐的层级匹配规则在搞鬼~

先给你理清楚原因:

  • 当你执行df1['x2'] = df2['x2']时,df2的索引是(a,b),正好对应df1三级索引的前两个层级,Pandas会自动识别并对齐这些匹配的层级,所以能得到正确结果。
  • 但df3只有单索引a,默认情况下Pandas会要求完全匹配所有索引层级(也就是要同时匹配a、b、c三个层级),显然df3没有b和c的信息,自然匹配失败,结果全是NaN。

接下来是不用合并或手动重索引的优雅解决方法:利用reindex方法的level参数,直接指定对齐的索引层级,代码简洁又符合Pandas的设计逻辑:

import pandas as pd

# 初始化原始数据框
df1 = pd.DataFrame({'x1': [1,2,3], 'a': [1,1,2], 'b': [10,20,10], 'c':[100, 200, 300]}).set_index(['a', 'b', 'c'])
df2 = pd.DataFrame({'x2': [1,3,4], 'a': [1,2,2], 'b': [10,10,20]}).set_index(['a', 'b'])
df3 = pd.DataFrame({'x3': [1,4], 'a': [1,2]}).set_index('a')

# 正确赋值x3:指定level='a'来对齐索引
df1['x3'] = df3['x3'].reindex(df1.index, level='a')

# 查看结果
print(df1)

运行后你会得到预期的结果:

x1   x2  x3
a b  c            
1 10 100  1  1.0   1
  20 200  2  NaN   1
2 10 300  3  3.0   4

这个方法的核心是:reindex(df1.index, level='a')会让df3的单索引a和df1三级索引中的a层级进行匹配,自动将df3的x3值广播到df1中对应a的所有行,完美实现你要的[1,1,4]效果。

内容的提问来源于stack exchange,提问作者curl-up

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:35:19