You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:31:17