pandas追加字典为DataFrame行时触发UnboundLocalError报错
报错根因
- 这个
UnboundLocalError: local variable 'user_df' referenced before assignment和追加操作本身无关,是Python作用域规则导致的:你大概率把这段逻辑写在了函数内部,且函数内存在对user_df的赋值语句,Python编译函数时会将整个作用域内赋值过的变量标记为局部变量,只要执行到追加行时user_df还没完成初始化(比如读csv的逻辑在某个没触发的分支里),就会抛出这个错误。 - 额外提醒:pandas 2.0及以上版本已经完全移除了
DataFrame.append()方法,就算解决了作用域问题,在新版本pandas环境下也会触发方法不存在的报错,不建议继续使用废弃的append写法。
可直接运行的修正方案
首先处理作用域问题:
- 如果要在函数内操作全局的
user_df,在函数开头加global user_df声明即可;如果是函数内局部变量,确保所有代码分支下,user_df在被引用前都完成了初始化赋值。
针对你「把字典作为新行添加到DataFrame」的核心需求,用官方推荐的pd.concat实现(兼容所有pandas版本,执行效率比旧append更高),不需要额外构造元组套列表的格式,直接写字典即可:
import pandas as pd # 读取csv文件生成DataFrame user_df = pd.read_csv('data/users.csv') # 直接用字典构造新行数据 new_user_row = { 'id': 1 if user_df.empty else int(user_df['id'].max()) + 1, 'username': request.form['username'], 'address': request.form.get('address'), 'city': request.form.get('city'), 'password': request.form.get('password'), 'orders': [], 'favorites': [], 'balance': 0.0 } # 拼接新行到原DataFrame,替换已废弃的append user_df = pd.concat( [user_df, pd.DataFrame([new_user_row])], ignore_index=True ) # 如果需要持久化到csv,追加完执行写入即可 # user_df.to_csv('data/users.csv', index=False)
小提示:上面id生成逻辑加了空表判断,避免users.csv是空文件时取max报错,比你原来的写法鲁棒性更好。
内容的提问来源于stack exchange,提问作者Flora Biletsiou
相关产品推荐
相关产品推荐

