如何用Pandas eval根据每行formula列计算生成新列C?
嘿,这个需求我之前也碰到过——直接用df.eval(df['formula'])确实行不通,因为它是把表达式整体作用在整个DataFrame上,没法逐行匹配不同的公式。不过有几个简单靠谱的方法能解决这个问题:
方法1:用apply结合原生eval(直观易用)
这是最直接的思路:逐行读取公式,把当前行的列值作为变量代入计算。代码示例如下:
import pandas as pd df = pd.DataFrame({'A': [1,2,3], 'B': [1,2,3], 'formula': ['A+B', 'A-B', 'A*B']}) # 逐行执行公式,row.to_dict()把当前行转成字典作为eval的局部变量 df['C'] = df.apply(lambda row: eval(row['formula'], globals(), row.to_dict()), axis=1)
方法2:用numexpr加速(适合大数据量场景)
如果你的DataFrame行数很多,原生eval的速度可能不够看。这时候可以用numexpr库来优化计算效率,它专门针对数值计算做了加速优化:
import pandas as pd import numexpr df = pd.DataFrame({'A': [1,2,3], 'B': [1,2,3], 'formula': ['A+B', 'A-B', 'A*B']}) def calc_row(row): return numexpr.evaluate(row['formula'], local_dict=row.to_dict()) df['C'] = df.apply(calc_row, axis=1)
注:需要先安装numexpr,执行pip install numexpr即可。
最终效果
不管用哪种方法,你都会得到想要的结果:
A B formula C 0 1 1 A+B 2 1 2 2 A-B 0 2 3 3 A*B 9
小提醒
- 公式里的变量名必须和DataFrame的列名完全一致,否则会报错;
- 如果公式是来自外部用户输入,要警惕
eval的安全风险(比如恶意代码注入),但如果是你自己生成的公式就不用担心这个问题。
内容的提问来源于stack exchange,提问作者Charlio
相关产品推荐
相关产品推荐

