【问题标题】:Automatically update Dataframe whenever object attributes change每当对象属性发生变化时自动更新 Dataframe
【发布时间】:2020-03-13 12:40:34
【问题描述】:

我有一个人类:

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

我想让这个数据框与对象同步,这样只要分数发生变化,它就会立即更新。

【问题讨论】:

  • 您能否将您的Person 对象存储在DataFrame 中?这可能允许您的属性被同步,具体取决于pandas 是否复制(?)
  • 是的@dspencer,那太好了。据我所知,您只能在数据框中存储静态字段。我想我会编写函数来更新 df 并在每次有可能更改值时调用它。
  • 根据我的快速测试,属性将传播回 DataFrame,稍后将发布示例

标签: python pandas dataframe data-science


【解决方案1】:

如果您将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

【讨论】:

  • 你知道如何在 df 的不同列中获取对象字段(带有更新的值)吗?
  • 我能建议的唯一方法是让每个属性本身成为一个类,即使每个类只存储一个变量。我建议最好在你想使用 DataFrame 的时候转换它的格式,而不是像这样实现一些有点“hacky”的东西。
  • 我决定调用它并在每次值发生变化时重新创建 df。这不是很有效,但我会为这个规模做。 df=pd.DataFrame.from_records([s.to_dict() for s in people])
  • 您多久需要一次DataFrame?它不一定是您数据的最佳存储解决方案,取决于使用情况
  • 我只是在开发过程中将其用于监控目的。应用程序使用的实际数据是对象字段
【解决方案2】:

您可以创建一个容器,用于存储您的数据框,并允许您在更新数据框时对每个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多