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
相关产品推荐
相关产品推荐

