我使用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 ()中设置的值,并且不保留它具有的属性值在合并之前。
有什么出路吗?使用不允许就地操作的方法保留此(和其他)属性的工作解决方案是什么?
答案 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