
本文介绍如何基于原始 dataframe 和一组字符串形式的数学表达式(如 'a0+b0'),高效生成包含计算列的新 dataframe,支持保留原始索引(如姓名)并避免冗余列。
本文介绍如何基于原始 dataframe 和一组字符串形式的数学表达式(如 'a0+b0'),高效生成包含计算列的新 dataframe,支持保留原始索引(如姓名)并避免冗余列。
在数据处理中,常需根据现有列动态构造新列(例如批量计算指标),而公式以字符串形式存储(如 `['a0+b0', 'a0-c0', 'b0*c0', 'a0+c0']`)。Pandas 提供了安全、高效的 `eval()` 方法配合字典推导式,可一键完成该任务。
最推荐的方式是:先提取索引列(如 'name'),再对剩余列执行公式计算,并将结果构造成新 DataFrame,最后用原索引设为行标签。代码简洁且语义清晰:
import pandas as pd
df = pd.DataFrame({
'name': ['alice', 'bob', 'charlie'],
'a0': [25, 26, 27],
'b0': [10, 11, 12],
'c0': [3, 4, 5],
})
formul = ['a0+b0', 'a0-c0', 'b0*c0', 'a0+c0']
# ✅ 推荐方案:生成纯计算列 + 原 name 作为索引
result = pd.DataFrame({
expr: df.eval(expr) for expr in formul
}).set_index(df['name'])
运行后得到目标结构:
a0+b0 a0-c0 b0*c0 a0+c0 name alice 35 22 30 28 bob 37 22 44 30 charlie 39 22 60 32
⚠️ 注意事项:
-
df.eval()在当前 DataFrame 的列命名空间内解析表达式,因此公式中列名必须与df.columns完全一致(区分大小写); - 避免在公式中引用未定义变量或使用复杂 Python 语法(
eval仅支持基础算术和布尔运算,不支持lambda、函数调用等); - 若需保留
'name'为普通列而非索引,可改用:result = pd.DataFrame({expr: df.eval(expr) for expr in formul}) result.insert(0, 'name', df['name']) # 插入到首列
? 进阶提示:如公式量极大,可结合 numexpr 引擎提升性能(df.eval(expr, engine='numexpr')),但默认 python 引擎已足够满足大多数场景。此方法替代了 R 中 eval(parse(text=...)) 的繁琐逻辑,兼具可读性与执行效率。











