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
相关产品推荐
相关产品推荐

