Pandas报错NameError: name 'x' is not defined的原因及高效解法
问题解答
错误原因
- 作用域不匹配:
eval(formula)默认在全局命名空间查找变量,但x是new_calculate函数的局部参数,不在全局作用域内,因此触发NameError。 - 公式与需求不符:你期望
new_a是l*w(比如100×200=20000),但代码中写的公式是x['l']+x['w'],这会导致结果完全不符合预期。
修复原代码的方案
给eval指定局部命名空间,让它能找到函数内的x,同时修正公式:
import pandas as pd def new_calculate(x, formulas): # 将x传入eval的局部命名空间,解决作用域问题 return pd.Series(eval(formula, {}, {'x': x}) for formula in formulas) col = { 's1':{'l':100, 'w':200}, 's2':{'l':200, 'w':400}, 's3':{'l':300, 'w':500} } coldf = pd.DataFrame.from_dict(col, orient='index') cols = ['new_a', 'new_p'] # 修正new_a的公式为乘法,new_p简化为2*(l+w) formulas = ["x['l']*x['w']", "2*(x['l']+x['w'])"] coldf[cols] = coldf.apply(lambda x : new_calculate(x, formulas), axis=1) print(coldf)
更高效的实现方式
apply逐行处理效率较低,数据量大时推荐以下两种方案:
方式1:原生向量化计算(最优)
Pandas支持列级向量化运算,速度最快,代码最简洁:
import pandas as pd col = { 's1':{'l':100, 'w':200}, 's2':{'l':200, 'w':400}, 's3':{'l':300, 'w':500} } coldf = pd.DataFrame.from_dict(col, orient='index') # 直接基于列计算新字段,完全向量化 coldf['new_a'] = coldf['l'] * coldf['w'] coldf['new_p'] = 2 * (coldf['l'] + coldf['w']) print(coldf)
方式2:用itertuples遍历处理
itertuples比apply效率更高,适合必须逐行处理的场景:
import pandas as pd col = { 's1':{'l':100, 'w':200}, 's2':{'l':200, 'w':400}, 's3':{'l':300, 'w':500} } coldf = pd.DataFrame.from_dict(col, orient='index') new_a_list = [] new_p_list = [] # itertuples返回命名元组,直接通过属性访问字段 for row in coldf.itertuples(): new_a = row.l * row.w new_p = 2 * (row.l + row.w) new_a_list.append(new_a) new_p_list.append(new_p) coldf['new_a'] = new_a_list coldf['new_p'] = new_p_list print(coldf)
动态公式场景优化
如果需要从外部读取动态公式,推荐用numexpr替代eval,既安全又高效:
import pandas as pd import numexpr as ne col = { 's1':{'l':100, 'w':200}, 's2':{'l':200, 'w':400}, 's3':{'l':300, 'w':500} } coldf = pd.DataFrame.from_dict(col, orient='index') formulas = ['l * w', '2*(l + w)'] cols = ['new_a', 'new_p'] for col_name, formula in zip(cols, formulas): # numexpr自动识别DataFrame列名,实现向量化计算 coldf[col_name] = ne.evaluate(formula, local_dict=coldf) print(coldf)
内容的提问来源于stack exchange,提问作者l a s
相关产品推荐
相关产品推荐

