Автоматически обновлять Dataframe при изменении атрибутов объекта - PullRequest
1 голос
/ 13 марта 2020

У меня есть класс person:

class Person:
    def __init__(self, name, score):
        self.name=name
        self.score=score
    def to_dict(self):
        return {
            'name':self.name,
            'score':self.score,
        }

, и я создаю несколько объектов Person и добавляю их в массив:

a=Person("Sam", 2)
b=Person("Tim", 3)
people=[a,b]

Теперь создаю из этого фрейм данных массив с использованием метода to_dict

df=pd.DataFrame.from_records([s.to_dict() for s in people])

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

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Если вы сохраните сами объекты Person в DataFrames и обновите те же экземпляры класса, то изменения атрибутов распространятся обратно на DataFrame, как показано в этом примере:

person1 = Person("Daniel", 95)                                                  

df = pd.DataFrame.from_dict({"People": [person1]})                              
print(df.People.iloc[0].score) # prints 95                                              

person1.score = 90                                                              
print(df.People.iloc[0].score) # prints 90
0 голосов
/ 13 марта 2020

Вы могли бы создать контейнер, в котором хранится ваш фрейм данных и который позволяет вносить изменения в каждый Person при обновлении фрейма данных.

class People:
    def __init__(self, *person):        
        for p in person:
            setattr(self, p.name, p.score)

    @property
    def df(self):
        return pd.DataFrame.from_dict(self.__dict__, orient='index', columns=['score'])     

Например,

people = People(Person('Bob', 2), Person('Carl', 5))
people.df

#       score
# Bob       2
# Carl      5 

Затем вы можете изменить атрибут

people.Carl = 10
people.df

#       score
# Bob       2
# Carl     10

Вы также можете добавить новый Person

people.james = 5
people.df

#       score
# Bob       2
# Carl     10
# james     5

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