如何将实例属性与pandas数据帧一起使用?

时间:2016-06-03 13:01:14

标签: python pandas dataframe instance

我使用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
        ...

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

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

1 个答案:

答案 0 :(得分:0)

跟踪变量中的新对象。使用新对象__dict__ attrubute更新对象的__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