Как добавить строку в фрейм данных panda внутри al oop, не перезаписывая его - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть класс с полем, созданным с пустым фреймом данных, например:

import pandas as pd


class Report:
    report = pd.DataFrame()

внутри этого класса у меня есть две функции, первая из которых выглядит так:

    def create_df(self):
        column_names = ["log_file_name", "Searched_Age", 
                        "Searched_Nationality", 
                        "Searched_Service_Type",
                        "all_p0", "all_p1", "all_p2", "all_p3", 
                        "p0", "p1", "p2", "p3", 
                        "no_prop_violated"]

        # add empty dataframe to class field.
        Report.report = pd.DataFrame(columns=column_names)

Вторая функция :

    def add_row(self, log_file_name, Searched_Age, 
                Searched_Nationality, 
                Searched_Service_Type,
                all_p0, all_p1, all_p2, 
                all_p3, p0, p1, p2, p3, no_prop_violated):

        dict_para = {'log_file_name': log_file_name,
                     'Searched_Age': Searched_Age,
                      'Searched_Nationality': Searched_Nationality,
                      'Searched_Service_Type': Searched_Service_Type,
                      'all_p0': all_p0,
                       'all_p1': all_p1,
                       'all_p2': all_p2,
                       'all_p3': all_p3,
                       'p0': p0,
                       'p1': p1,
                       'p2': p2,
                       'p3': p3,
                       'no_prop_violated': no_prop_violated}
        Report.report = Report.report.append(dict_para, ignore_index=True)

        print(Report.report)

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я вызываю add_row () из другого класса, строка перезаписывается. Код, о котором я говорю:

Report.report = Report.report.append(dict_para, ignore_index=True)

1 Ответ

0 голосов
/ 11 апреля 2020

Я думаю, что вы перепутали несколько вещей при создании своего класса. Рассмотрим следующий пример

class TestClass:
  def __init__(self):
    self.reports = []

  def addReport(self, report):
    self.reports.append(report)


test = TestClass()

test.addReport('one')
test.addReport('two')

print(test.reports) # ['one', 'two']

Это работает, поскольку класс правильно инициализирован методом __init__. В этом методе определяется массив отчетов. После этого я вызываю инструктор класса, чтобы получить новый экземпляр этого класса. С этим экземпляром я делаю свою работу.

Далее, когда я хочу добавить в этот массив метод класса, я должен использовать ключевое слово self. Причина, по которой вы должны определить это в каждой функции класса, заключается в том, что вы хотите получить доступ к большему количеству вещей из этого класса, и поэтому вам нужен сам класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...