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

如何将给定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表筛选同时满足以下条件的行:

  1. park字段值为1
  2. tickt字段值为1
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:01:10