如何将Sympy.Solve应用于DataFrame每行,求解含λ的双边方程?
如何将SymPy求解应用到DataFrame每行并生成结果列
步骤1:先求λ的通用解析表达式
不要直接代入数值求解,先把所有参数定义为符号变量,让SymPy帮你解出λ的通用公式——这比逐行调用solve效率高得多,也避免手动移项的麻烦。
from sympy import symbols, Eq, solve, lambdify import math import pandas as pd # 定义所有符号变量 λ, tmin, tmax, Tmin, Tmax, D = symbols('λ tmin tmax Tmin Tmax D') pi = math.pi # 构建方程右侧的表达式 rhs = (((Tmax-Tmin)/2) * (λ - tmin) * (1 - (2/pi))) + \ (((Tmax-Tmin)/2) * (tmax - λ) * (1 + (2/pi))) - \ (((Tmax-Tmin)/2) * (tmax - tmin)) # 构建等式 D = 右侧表达式 eq = Eq(D, rhs) # 求解λ的解析表达式 lambda_expr = solve(eq, λ)[0]
步骤2:将表达式转为可批量计算的函数
用lambdify把符号表达式转换成支持numpy数组运算的函数,这样可以直接对接DataFrame的列数据:
# 转换为numpy兼容函数,参数顺序对应tmin, tmax, Tmin, Tmax, D lambda_func = lambdify((tmin, tmax, Tmin, Tmax, D), lambda_expr, 'numpy')
步骤3:应用到DataFrame生成新列
直接用向量化方式计算,效率远高于逐行apply:
# 构造示例DataFrame data = [[6, 14, 33.2067, 42.606, 19.5526], [6, 14, 33.4885, 43.0318, -27.9222]] df = pd.DataFrame(data, columns=['tmin', 'tmax', 'Tmin', 'Tmax', 'D']) # 生成结果列 df['lambda_result'] = lambda_func(df['tmin'], df['tmax'], df['Tmin'], df['Tmax'], df['D']) print(df)
备选:逐行apply方式(仅适合小数据量)
如果遇到复杂到无法提前求解析表达式的场景,也可以用apply逐行求解,但效率较低:
def solve_lambda(row): # 提取当前行的数值 tmin_val, tmax_val = row['tmin'], row['tmax'] Tmin_val, Tmax_val = row['Tmin'], row['Tmax'] D_val = row['D'] # 代入数值构建方程 rhs_val = (((Tmax_val-Tmin_val)/2) * (λ - tmin_val) * (1 - (2/pi))) + \ (((Tmax_val-Tmin_val)/2) * (tmax_val - λ) * (1 + (2/pi))) - \ (((Tmax_val-Tmin_val)/2) * (tmax_val - tmin_val)) eq_val = Eq(D_val, rhs_val) return solve(eq_val, λ)[0] df['lambda_result'] = df.apply(solve_lambda, axis=1)
内容的提问来源于stack exchange,提问作者WCeconomics
相关产品推荐
相关产品推荐

