如何基于另一DataFrame的系数对DataFrame应用指定数学方程?
问题:基于系数表计算输入DataFrame的目标值
现有两个DataFrame:
input_df(各水果的数值):
Apples Pears Peaches Grapes 12 23 0 4 10 0 0 4 12 16 12 5 6 0 0 11
coefficients_df(各水果对应的计算系数):
Fruit n w1 w2 Apples 2 0.4 40 Pears 1 0.1 43 Peaches 1 0.6 51 Grapes 2 0.5 11
需要对input_df的每个元素应用公式:y = w2*(1-exp(-w1*input_df^n))
其中n、w1、w2取自coefficients_df中对应水果的系数。
原尝试代码存在多处问题,以下是修正后的实现方案:
原代码问题分析
- pivot与merge用法错误:
coefficients_df.pivot('Fruit')缺少必要参数,且merge无法将输入表的列名与系数表的行关联 - 变量未定义:lambda中的
w2、w1、n未绑定到系数表的对应值 - 运算符错误:Python中数学幂运算用
**,^是位异或操作,不符合需求 - 函数未导入:
exp需使用numpy库的np.exp,不能直接调用
正确实现代码
import numpy as np import pandas as pd # 初始化输入DataFrame input_df = pd.DataFrame({ 'Apples': [12, 10, 12, 6], 'Pears': [23, 0, 16, 0], 'Peaches': [0, 0, 12, 0], 'Grapes': [4, 4, 5, 11] }) # 初始化系数DataFrame coefficients_df = pd.DataFrame({ 'Fruit': ['Apples', 'Pears', 'Peaches', 'Grapes'], 'n': [2, 1, 1, 2], 'w1': [0.4, 0.1, 0.6, 0.5], 'w2': [40, 43, 51, 11] }) # 将系数表设置为以Fruit为索引,方便按列名匹配系数 coeffs = coefficients_df.set_index('Fruit') # 对输入表的每一列(对应一个水果)应用公式,利用pandas广播机制完成元素级计算 output_df = input_df.apply( lambda col: coeffs.loc[col.name, 'w2'] * (1 - np.exp(-coeffs.loc[col.name, 'w1'] * (col ** coeffs.loc[col.name, 'n']))) ) print(output_df)
代码逻辑说明
- 将
coefficients_df的索引设置为Fruit,这样可以通过输入表的列名(如Apples)直接定位到对应的系数组 - 使用
input_df.apply遍历每一列,针对每个水果列,取出对应的n、w1、w2 - 利用numpy的元素级运算完成公式计算:
col ** coeffs.loc[col.name, 'n']:对列中每个元素做幂运算np.exp(-w1 * 幂运算结果):计算指数项- 最终按公式组合得到每个元素的目标值
运行后输出结果如下:
Apples Pears Peaches Grapes 0 40.000000 42.999985 0.000000 10.999999 1 40.000000 0.000000 0.000000 10.999999 2 40.000000 42.999717 50.999999 11.000000 3 39.999999 0.000000 0.000000 11.000000
内容的提问来源于stack exchange,提问作者star_it8293
相关产品推荐
相关产品推荐

