如何用Pandas/NumPy实现三元素SUMPRODUCT计算并获正确结果?
修正后的代码及解释
首先明确计算逻辑:
- 分子:对每个Class,计算
(SPG.AA * INIT.AA * DIET.AA) + (SPG.BB * INIT.BB * DIET.BB) - 分母:对每个Class,计算
(SPG.AA * DIET.AA) + (SPG.BB * DIET.BB) - F-Result = 分子 / 分母
完整修正代码
import pandas as pd # 构造示例数据集(实际使用时替换为你的数据源) SPG = pd.DataFrame({ 'Class': ['AG', 'AL', 'LP', 'TS', 'HV'], 'Group': ['SPG']*5, 'AA': [0.25, 0.15, 1.15, 1.5, 1.25], 'BB': [2.25, 1.8, 3.5, 0.45, 1.0] }) INIT = pd.DataFrame({ 'Class': ['LP', 'TS', 'HV'], 'Group': ['INIT']*3, 'AA': [0.65, 4.5, 2.75], 'BB': [3.25, 1.55, 0.65] }) DIET = pd.DataFrame({ 'AA': [0.004], 'BB': [0.15] }) # 提取DIET的权重值(转为Series方便广播计算) diet_weights = DIET.iloc[0] # 合并SPG和INIT,只保留共同的Class merged = pd.merge(SPG, INIT, on='Class', suffixes=('_spg', '_init')) # 计算分子:SPG*INIT*DIET 逐元素相乘后求和 numerator = (merged['AA_spg'] * merged['AA_init'] * diet_weights['AA'] + merged['BB_spg'] * merged['BB_init'] * diet_weights['BB']) # 计算分母:SPG*DIET 逐元素相乘后求和 denominator = (merged['AA_spg'] * diet_weights['AA'] + merged['BB_spg'] * diet_weights['BB']) # 计算F-Result并保留三位小数 merged['F-Result'] = (numerator / denominator).round(3) # 整理成目标结果格式 res = merged[['Class']].copy() res['Group'] = 'RES' res['F-Result'] = merged['F-Result'] print(res)
代码修正说明
- 变量名修正:原代码中
ISPG是笔误,改为正确的SPG - DIET数据处理:将DIET的单行数据转为Series,方便后续逐列广播计算
- 合并数据:使用
merge关联SPG和INIT,通过suffixes区分两个表的AA/BB列,避免列名冲突 - 分子分母计算:直接通过逐元素相乘再求和的方式实现SUMPRODUCT逻辑,比
dot更贴合需求 - 结果整理:提取需要的列,设置Group为'RES',并将结果保留三位小数,与预期格式一致
运行结果
Class Group F-Result 0 LP RES 3.227 1 TS RES 1.791 2 HV RES 0.718
内容的提问来源于stack exchange,提问作者ENAT
相关产品推荐
相关产品推荐

