如何在Pandas中向量化计算批量表达式?
批量计算DataFrame中表达式列的解决方案
问题原因
你用pd.eval(df["expressions"], local_dict=dict_all_values)失败的核心原因是:pd.eval的作用是解析单个字符串表达式,而非逐行处理Series中的每个表达式。它会把整个Series的内容拼接成一个大表达式尝试计算,自然返回结果数量和实际表达式数量不匹配。
高效解决方法
方法1:列表推导 + 内置eval
这是最直接且高效的方式,适合2万级别的数据量:
import pandas as pd # 示例数据 df = pd.DataFrame({"expressions": ["A + B", "B + C", "A * C"]}) dict_all_values = {"A": 5, "B": -2.1, "C": 3.5} # 批量计算每个表达式 df["result"] = [eval(expr, {}, dict_all_values) for expr in df["expressions"]]
这里用空字典作为全局命名空间,仅传入你的本地字典作为局部命名空间,避免污染全局变量,同时保证计算准确。
方法2:apply结合内置eval
如果习惯DataFrame的链式操作,也可以用apply:
df["result"] = df["expressions"].apply(lambda expr: eval(expr, {}, dict_all_values))
对于2万条数据,apply的执行速度和列表推导差距不大,可根据代码风格选择。
方法3:构造批量表达式用pd.eval计算
如果想利用pd.eval的优化能力,可以把每个表达式转换成引用字典的形式,再批量计算:
# 将表达式中的变量替换为字典键的引用 df["formatted_expr"] = df["expressions"].replace( pattern=list(dict_all_values.keys()), repl=[f"dict_all_values['{k}']" for k in dict_all_values.keys()], regex=True ) # 拼接成批量表达式并用pd.eval计算 df["result"] = pd.eval(f"[{','.join(df['formatted_expr'])}]")
这种方式能借助pd.eval的底层优化,适合数据量更大的场景。
内容的提问来源于stack exchange,提问作者Brayan Muñoz
相关产品推荐
相关产品推荐

