如何将给定SQL转换为带if-else的Python代码并解决NameError报错
SQL转pandas实现的报错修复与正确代码
报错核心原因
你遇到的NameError: name 'park' is not defined以及后续潜在问题,来自几个pandas写法和逻辑理解的错误:
- 直接写
park==1会被Python识别为调用独立变量park,但pandas中取DataFrame的列必须使用表名['列名']的格式 - 多条件过滤的语法错误:pandas中不能用原生
and连接过滤条件,且每个条件必须单独包裹括号,你写的range(700007:73599)本身也不符合Python语法(range的参数是逗号分隔,且左闭右开,和原SQL的区间规则不一致) - 逻辑理解偏差:原SQL的
where是先过滤符合条件的行,再在过滤后的子集上做统计,不是判断全表是否满足条件再计算全表统计值 - 语法疏漏:else分支只写
np.NaN没有赋值操作,不会给A、B赋空值;同时你把原SQL中的Col12误写为Col2,运行时会触发列不存在的报错
原SQL逻辑拆解
第一段逻辑:从
_fx_bfr_wgt表筛选同时满足以下条件的行:
- park字段值为1
- tickt字段值为1
- zip字段转为8位数值后,值落在700007到73599的闭区间(包含两端值)
对筛选后的子集统计总行数存入A,统计park字段总和存入B,筛选结果为空时A、B均为空值
第二段逻辑:从_fx_weights表分别计算Col1、Col12、Col3、Col4、Col5五个字段的列总和,再将五个求和结果相加存入Total_sum
正确实现代码
import numpy as np import pandas as pd # 计算A、B # 先将zip列转为数值,对应SQL中input(zip,8.)的逻辑,转值失败的填充为空值 _fx_bfr_wgt['zip_convert'] = pd.to_numeric(_fx_bfr_wgt['zip'], errors='coerce') # 构造过滤条件 filter_condition = ( (_fx_bfr_wgt['park'] == 1) & (_fx_bfr_wgt['tickt'] == 1) & (_fx_bfr_wgt['zip_convert'] >= 700007) & (_fx_bfr_wgt['zip_convert'] <= 73599) ) # 取出过滤后的子集 filtered_data = _fx_bfr_wgt[filter_condition] # 按if-else逻辑赋值 if len(filtered_data) > 0: A = len(filtered_data) # 等价于filtered_data.shape[0],对应SQL的count(*) B = filtered_data['park'].sum() else: A = np.nan B = np.nan # 打印验证 print(f"A: {A}, B: {B}") # 计算Total_sum Total_sum = ( _fx_weights['Col1'].sum() + _fx_weights['Col12'].sum() + _fx_weights['Col3'].sum() + _fx_weights['Col4'].sum() + _fx_weights['Col5'].sum() ) print(f"Total_sum: {Total_sum}")
pandas过滤写法注意点
- 多条件组合时,每个独立条件必须用圆括号包裹,“且”的关系用
&,“或”的关系用|,不能用原生Python的and/or - 列名必须通过
df['列名']的方式引用,不能直接写列名调用 - 数值闭区间判断直接用
>=+<=即可,不要用range处理连续数值,容易出现边界值遗漏问题 - 赋值语句必须明确写
变量名 = 值,单独写一个值不会完成变量赋值
内容的提问来源于stack exchange,提问作者anjan paul
相关产品推荐
相关产品推荐

