如何修正Python中Pandas query的UndefinedVariableError错误
报错原因分析与解决方法
报错原因
- 字符串拼接缺失引号:批量循环时用f-string生成query语句,替换后的州名没有被引号包裹。比如处理
"Jammu & Kashmir"时,最终生成的条件是Last_residence==Jammu & Kashmir,Pandas会将Jammu识别为未定义的变量,而非字符串值,因此抛出UndefinedVariableError。而单个执行时你手动给州名加了双引号,所以能正确识别为字符串常量。 - 数据框被意外修改:使用
inplace=True会直接修改原andhrapradesh数据框,第一次循环过滤后,后续循环是在已过滤的数据集上再次筛选,导致结果完全错误。
解决方法
方法1:f-string拼接时添加引号
给f-string中的{name}包裹双引号,确保替换后是合法的字符串匹配条件,同时复制原数据避免修改原始数据集:
states = ["Jammu & Kashmir","Punjab",'Himachal Pradesh'] # 复制原数据,避免循环中修改原始数据 original_df = andhrapradesh.copy() for name in states: filtered_df = original_df.query(f'Duration_of_residence=="All durations of residence" & Last_residence_R_or_U=="Urban" & Last_residence=="{name}"') print(f"{name}: {filtered_df['Total_migrants'].sum()}")
方法2:使用query的变量引用(@符号)
Pandas的query支持用@直接引用当前作用域的变量,无需手动拼接字符串,更简洁安全:
states = ["Jammu & Kashmir","Punjab",'Himachal Pradesh'] original_df = andhrapradesh.copy() for name in states: filtered_df = original_df.query('Duration_of_residence=="All durations of residence" & Last_residence_R_or_U=="Urban" & Last_residence==@name') print(f"{name}: {filtered_df['Total_migrants'].sum()}")
内容的提问来源于stack exchange,提问作者Dvarkesh
相关产品推荐
相关产品推荐

