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

多索引DataFrame与单索引DataFrame相乘的实现方法

问题:多索引DataFrame与单索引DataFrame按索引匹配相乘

数据结构

多索引DataFrame A

LL           SK           Di         Co
Bracket         yr_wk               
1                121       2            2             4           3
                 122       3            6             5           4
                 123       3            2             6           2
                 124       2            5             5           3
                 125       3            5             6           3

2                121       4            7             1           6
                 122       1            5             1           7
                 123       3            9             6           4
                 124       5            1             5           6
                 125       8            7             7           2

单索引DataFrame B

Factor
yr_wk   
121        0.98
122        1.045
123        0.92
124        0.99
125        0.95

需求

按yr_wk分组,将DataFrame B的Factor列与DataFrame A的各列对应相乘,得到目标结果(各单元格为原数值与对应Factor的乘积)。直接使用C = A.multiply(B)会因索引不匹配失败。

解决方案

方法1:提取二级索引匹配Factor后相乘

通过提取A的二级索引yr_wk,从B中获取对应的Factor值,再与A逐行相乘:

# 获取A中每一行对应的Factor值
factor_series = B.loc[A.index.get_level_values('yr_wk'), 'Factor']
# 执行乘法,pandas会自动对齐索引
C = A.multiply(factor_series, axis=0)

方法2:分组后逐组相乘

按yr_wk分组,对每个子组乘以对应的Factor值:

def apply_factor(group):
    # 从分组名中获取当前yr_wk
    current_yr_wk = group.name[1]
    return group * B.loc[current_yr_wk, 'Factor']

# 按(Bracket, yr_wk)分组后应用函数
C = A.groupby(level=['Bracket', 'yr_wk']).apply(apply_factor)

方法3:利用广播简化操作

直接通过索引匹配获取Factor数组,利用numpy广播完成乘法:

C = A * B.loc[A.index.get_level_values('yr_wk')].values

说明

直接调用multiply失败的原因是:A为双层索引(Bracket, yr_wk),而B为单层索引(yr_wk),pandas无法自动将单层索引与双层索引的二级索引对齐,必须显式指定要匹配的索引级别或提取对应的值序列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:01:18