首页 > 解决方案 > 对象没有属性“索引”

问题描述

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()  

for i,rowObject in sqldf("select distinct Name from objAbc.df").iterrows(): 
    print(rowObject.Name)

AttributeError                            Traceback (most recent call last)
<ipython-input-21-aaba2874542d> in <module>
      8 objAbc=ABC()
      9 
---> 10 for i,rowObject in sqldf("select distinct Name from objAbc.df").iterrows():
     11     print(rowObject.Name)
     12 

~\anaconda3\lib\site-packages\pandasql\sqldf.py in sqldf(query, env, db_uri)
    154     >>> sqldf("select avg(x) from df;", locals())
    155     """
--> 156     return PandaSQL(db_uri)(query, env)

~\anaconda3\lib\site-packages\pandasql\sqldf.py in __call__(self, query, env)
     56                     continue
     57                 self.loaded_tables.add(table_name)
---> 58                 write_table(env[table_name], table_name, conn)
     59 
     60             try:

~\anaconda3\lib\site-packages\pandasql\sqldf.py in write_table(df, tablename, conn)
    119                        message='The provided table name \'%s\' is not found exactly as such in the database' % tablename)
    120         to_sql(df, name=tablename, con=conn,
--> 121                index=not any(name is None for name in df.index.names))  # load index into db if all levels are named
    122 
    123 

AttributeError: 'ABC' object has no attribute 'index'

** 我想使用 pandasql 遍历 ABC 类中定义的数据框。sqldf 函数但出现错误。

'ABC' 对象没有属性 'index'

PS:根据要求,必须使用 pandasql 的 sqldf。

请帮忙 **

标签: pythondataframepandasql

解决方案


我发现的唯一解决方案是子类化数据框:

import() pandas as pd
from pandasql import sqldf

class ABC(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        details = {'Name' : ['Ankit', 'Aishwarya', 'Shaurya', 'Shivangi'],'Age' : [23, 21, 22, 21]}
  
        super().__init__(details, *args, **kwargs)

        #self._details = details
        object.__setattr__(self, "details", details )

objAbc = ABC()
for index,row in sqldf("select Name from objAbc").iterrows():
    print(row.Name)

似乎 pandasql 找不到类变量。请注意,由于无法添加列的警告,无法设置详细信息 self.details。


推荐阅读