【问题标题】:How do I use instance attributes with pandas dataframe?如何将实例属性与 pandas 数据框一起使用?
【发布时间】:2016-10-03 13:32:41
【问题描述】:

我使用 pandas 数据框从 oracle 数据库中访问海量数据,这工作正常。我在派生自数据框的类中实现的一个函数将外键替换为外键指向的数据。效果很好。

因为数据帧中的行数非常高(即 100.000.000),所以我认为在一次又一次这样做之前实现一些测试外键是否已经被替换的东西会很好。所以给派生类增加了一个属性,在数据被替换后设置为True,这样replace方法就可以测试这个状态,如果已经是True就可以跳出来。

class DerivedDataFrame(pandas.DataFrame):
    def __init__(self):
        self.resolve_status = False

    def resolve_data(self, ....):
        if not self.resolve_status:
            resolve data
            self.resolve_status = True
        ...

问题是当我使用即合并()时,它不能就地工作,而是从合并的数据创建一个新实例并返回它。数据本身没问题,但是由于新实例 self.resolve_status 再次为 False,因为新实例具有 init() 中设置的值,并且不保留合并前的属性值.

有什么办法吗?使用不允许就地操作的方法保留此(和其他)属性的有效解决方案是什么?

【问题讨论】:

  • 您是否考虑过在您的类中编写自己的方法来满足您的需求?这应该很简单,不是吗?
  • @John Zwinck:不确定你的意思。当然,我是否有可以(很可能必须)将属性复制到新实例的方法,但不知何故,我希望 pandas 能以更好的方式实现这一点。似乎没有。悬而未决的问题是:为什么不合并支持以就地工作。

标签: python pandas dataframe instance


【解决方案1】:

跟踪变量中的新对象。使用新对象 __dict__ 属性更新对象的 __dict__ 属性。

__dict__ 属性是所有属性和方法的字典。这就是我过去做过类似事情的方式。

    def resolve_data(self):
        if not self.resolve_status:
            self.resolve_status = True
            new = self.copy()  # just an example, replace with your own
            self.__dict__.update(new.__dict__)

演示

import pandas as pd


class SubDF(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        super(SubDF, self).__init__(*args, **kwargs)
        self.resolve_status = False

    def resolve_data(self):
        if not self.resolve_status:
            self.resolve_status = True
            new = self.copy() * 3
            self.__dict__.update(new.__dict__)


sdf = SubDF([1, 2, 4])

print sdf.resolve_status
print
print sdf
print
sdf.resolve_data()
print sdf.resolve_status
print
print sdf

False

   0
0  1
1  2
2  4

True

    0
0   3
1   6
2  12

【讨论】:

  • 这意味着只是将属性复制到新的数据框实例,如果我理解正确的话?这就是我正在做的,但我希望有一个更好的解决方案。但是“self.__dict__.update(new.__dict__)”应该是“new.__dict__.update(self.__dict__)”吧?
猜你喜欢
  • 2021-01-25
  • 2019-03-14
  • 1970-01-01
  • 2021-01-01
  • 2016-10-06
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多