Возвращает фрейм данных как метод класса

#python #class #dataframe

#python #класс #фрейм данных

Вопрос:

Я хотел бы создать объекты отчета, которые являются фреймами данных при создании объекта. код предназначен для чтения файла и выполнения некоторой фильтрации как части создания экземпляра и вызова метода load

 class Report:
    def __init__(self,c = ['red','green','blue'],y = [2015,2016,2017,2018,2019]):
        self.color = c
        self.years = y

    def load(self):
        df = pd.read_excel(r"C:UsersgerDesktopsample.xlsx",sheet_name='sht1')
        df = df.loc[(df['color'].isin(self.color) amp; 
                     df['year'].isin(self.years)),:]
        return df

# none of these below seems to work though
r1 = Report().load()

# or
r1 = Report()
r1 = r1.load()
  

Ожидаемым результатом будет фрейм данных с полями цвета и года, как указано в init или как определено в вызове Report(). Любые мысли приветствуются

Комментарии:

1. можете ли вы поделиться образцом вашего файла Excel? Код работает для меня, если я использую фиктивный фрейм данных

2. @venky__: в файле Excel, который я использовал, была некоторая проблема с ним. Я использовал новый файл, и код сработал. Спасибо!

Ответ №1:

Если ваша цель — использовать load в качестве фактического метода класса, вот пример того, как это работает в вашем случае:

 import pandas as pd

class Report:
    def __init__(self, c=['red', 'green', 'blue'], y=[2017, 2018, 2019]):
        self.color = c
        self.years = y

    @classmethod
    def load(cls, self):
        df = pd.DataFrame(
            {'color': ['red', 'blue', 'green', 'yellow', 'purple'],
             'year': [2015, 2016, 2017, 2018, 2019]}
        )
        df = df.loc[df['color'].isin(self.color) amp; df['year'].isin(self.years)]
        self.df = df
  

В действии:

 >>> report = Report()
>>> Report.load(report)
>>> print(report.df)
   color  year
2  green  2017