Python实现where方法筛选NBA球员CSV数据遇‘name where not defined’报错求助
CSV NBA球员数据筛选问题解决:query报错与自定义where方法实现
一、解决df.query()报错问题
你的代码中df.query()报错,核心原因是CSV字符串格式错误:Kareem Abdul-Jabbar那一行的college字段值'University of California, Los Angeles缺少闭合单引号,导致pd.read_csv解析时出现异常,破坏了列结构,使得name列无法被正确识别。
修正后的CSV字符串需补上闭合单引号:
csvString = "name,year_start,year_end,position,height,weight,birth_date,college\nAlaa Abdelnaby,1991,1995,F-C,6-10,240,'June 24, 1968',Duke University\nZaid Abdul-Aziz,1969,1978,C-F,6-9,235,'April 7, 1946',Iowa State University\nKareem Abdul-Jabbar,1970,1989,C,7-2,225,'April 16, 1947','University of California, Los Angeles'\nMahmoud Abdul-Rauf,1991,2001,G,6-1,162,'March 9, 1969',Louisiana State University\n"
修正后执行df.query(where)即可正常筛选目标记录,你当前写的"name = 'Alaa Abdelnaby' AND year_start = 1991"语法符合df.query要求,无需修改。
二、实现MySelectQuery类的where筛选功能
基于pandas实现自定义类的筛选逻辑,简洁高效,修改后的代码如下:
import csv import pandas as pd import io class MySelectQuery: def __init__(self, table, columns, where): self.table = table # 支持传入CSV字符串或已加载的DataFrame self.columns = columns self.where = where def __str__(self): return f"SELECT {self.columns} FROM table WHERE {self.where}" def execute(self): # 处理CSV字符串转DataFrame if isinstance(self.table, str): df = pd.read_csv(io.StringIO(self.table), error_bad_lines=False) else: df = self.table # 筛选指定列,*表示所有列 if self.columns != '*': df = df[self.columns.split(',')] # 应用where条件筛选行 if self.where: df = df.query(self.where) return df # 使用示例 csvString = "name,year_start,year_end,position,height,weight,birth_date,college\nAlaa Abdelnaby,1991,1995,F-C,6-10,240,'June 24, 1968',Duke University\nZaid Abdul-Aziz,1969,1978,C-F,6-9,235,'April 7, 1946',Iowa State University\nKareem Abdul-Jabbar,1970,1989,C,7-2,225,'April 16, 1947','University of California, Los Angeles'\nMahmoud Abdul-Rauf,1991,2001,G,6-1,162,'March 9, 1969',Louisiana State University\n" # 创建查询实例,指定列和筛选条件 query = MySelectQuery(table=csvString, columns='name,college', where="name = 'Alaa Abdelnaby' AND year_start = 1991") # 执行查询并输出结果 result = query.execute() print(result)
代码说明:
__init__方法兼容CSV字符串和DataFrame两种输入,提升灵活性。execute方法完成核心逻辑:将CSV转DataFrame、筛选指定列、应用where条件。__str__方法保留SQL风格输出,方便调试。
若不想依赖pandas,可基于原生csv模块实现,但需要手动解析where条件(拆分AND/OR、比较字段值),复杂度较高,推荐使用pandas方案。
内容的提问来源于stack exchange,提问作者Leon Abdel-Aziz
相关产品推荐
相关产品推荐

