使用pandasql.sqldf查询类内DataFrame报无index属性错误如何解决
错误原因
- 首先你原代码存在缩进错误:
self.df = pd.DataFrame(self.details)这行不在__init__方法内部,运行会直接触发语法错误,需要先修正缩进,把这行放到__init__函数块内。 - 核心报错原因:pandasql的sqldf函数解析SQL语句中的表名时,只会提取最顶层的变量名,无法识别
objAbc.df这种嵌套属性的写法。它会把objAbc识别为表名,直接从运行环境中取objAbc这个ABC类的实例对象传入后续逻辑,而该对象不是DataFrame,没有index属性,就触发了AttributeError。
解决方法
两种可行方案都可以保留pandasql的使用:
方案1:提前提取DataFrame为顶层变量
先把类实例里的df属性赋值给一个独立的变量,SQL中直接用这个变量名作为表名:
import pandas as pd from pandasql import sqldf class ABC: def __init__(self): self.details = {'Name' : ['Ankit', 'Aishwarya', 'Shaurya', 'Shivangi'],'Age' : [23, 21, 22, 21]} # 修正缩进放到__init__内部 self.df = pd.DataFrame(self.details) objAbc=ABC() # 提前提取df为顶层变量 query_df = objAbc.df # SQL里直接用变量名作为表名 for i,rowObject in sqldf("select distinct Name from query_df").iterrows(): print(rowObject.Name)
方案2:手动指定env参数映射表名
给sqldf传入env参数,手动建立SQL表名和实际DataFrame的映射关系:
import pandas as pd from pandasql import sqldf class ABC: def __init__(self): self.details = {'Name' : ['Ankit', 'Aishwarya', 'Shaurya', 'Shivangi'],'Age' : [23, 21, 22, 21]} self.df = pd.DataFrame(self.details) objAbc=ABC() # 手动指定表名和df的映射 sql_env = { "user_df": objAbc.df } for i,rowObject in sqldf("select distinct Name from user_df", env=sql_env).iterrows(): print(rowObject.Name)
内容的提问来源于stack exchange,提问作者siddhartha jain
相关产品推荐
相关产品推荐

