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

