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

Pandas DataFrame出现NameError错误:df2未定义的解决求助

问题解决:NameError: name 'df2' is not defined

错误原因

函数get_id_for_code的内部作用域无法访问外部定义的df2变量,导致抛出NameError。同时你的循环代码还存在两处问题:一是循环遍历的变量名错误(应该是df1.iterrows()而非df.iterrows());二是直接赋值result['resultId']会覆盖整列数据,需改为逐行定位赋值。


方法1:修正作用域与循环逻辑

将df2作为参数传入函数,同时修复循环中的变量名和赋值逻辑:

def get_id_for_code(code, df2):
    try:
        return df2.loc[df2['code'] == code, 'id'].iloc[0]
    except IndexError:
        return None

# 初始化结果DataFrame
result = df1.copy()
result['resultId'] = None

for index, row in df1.iterrows():
    result.loc[index, 'resultId'] = get_id_for_code(row['col'], df2)

方法2:更高效的Pandas原生方案(推荐用于大型数据)

iterrows()在处理大型DataFrame时效率极低,推荐使用Pandas原生的map或merge方法,这才是符合Pandas设计思想的高效做法:

方案A:使用map(最简映射)

先构建code到id的映射字典,再快速映射到df1:

# 构建code与id的映射字典
code_to_id = df2.set_index('code')['id'].to_dict()
# 完成映射,不存在的code自动返回None
df1['resultId'] = df1['col'].map(code_to_id)

方案B:使用merge(灵活保留匹配信息)

如果需要保留更多关联数据,用左连接更灵活:

# 左连接,保留df1所有行,匹配不到的id显示为NaN
result = df1.merge(df2, left_on='col', right_on='code', how='left')
# 可选:将NaN替换为None
result['id'] = result['id'].where(result['id'].notna(), None)
# 可选:重命名列并清理冗余字段
result = result.rename(columns={'id': 'resultId'}).drop('code', axis=1)

这两种方法的执行效率远高于循环遍历,尤其适合你提到的大型内部数据场景。

内容的提问来源于stack exchange,提问作者Pallavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:10:02