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

如何用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)

代码修正说明

  1. 变量名修正:原代码中ISPG是笔误,改为正确的SPG
  2. DIET数据处理:将DIET的单行数据转为Series,方便后续逐列广播计算
  3. 合并数据:使用merge关联SPG和INIT,通过suffixes区分两个表的AA/BB列,避免列名冲突
  4. 分子分母计算:直接通过逐元素相乘再求和的方式实现SUMPRODUCT逻辑,比dot更贴合需求
  5. 结果整理:提取需要的列,设置Group为'RES',并将结果保留三位小数,与预期格式一致

运行结果

Class Group  F-Result
0    LP   RES     3.227
1    TS   RES     1.791
2    HV   RES     0.718

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:07:50