将函数应用于 Pandas DataFrame 的子类只是 returns DataFrame 现在是子类

Applying function to subclass of Pandas DataFrame just returns DataFrame and now Subclass

我正在尝试子类化 Pandas' DataFrame 对象。

class AbundanceFrame(pd.DataFrame):
   'Subclass of DataFrame used for creating simulated dataset with various component timeseries'

    def __init__(self, days,*args,**kw):
        'Constructor for AbundanceFrame class, must pass index of timeseries'
        super(AbundanceFrame,self).__init__(index = days,*args,**kw)
        self.steps = 0
        self.monotonic = 0

我有许多其他方法可以将模拟时间序列添加到生成的 AbundanceFrame 中。生成的丰度框架采用以下形式:

然后我想对丰度框架中的所有数据应用泊松采样噪声。

def apply_poisson_noise(self,keys=False):
    temp = self.copy()
    #print type(temp)
    if keys != False: 
        for key in keys:
            temp[key] = np.random.poisson(self[key])            
    else: 
        temp = self.apply(np.random.poisson)
    return temp

有了上面的内容,我可以毫无问题地创建一个 AbundanceFrame。但是,当我尝试 apply_poisson_noise() 时,它 return 是一个 DataFrame 而不是 AbundanceFrame。我一直在网上搜索,但没有找到将函数应用于 pandas 的 DataFrames 的方法。

我想知道如何获得此功能和 return AbundanceFrame。

谢谢!

解决了问题:(基于 user4589964 的响应) 在 apply_poisson_noise() 中,我只是调用 AbundanceFrame 构造函数并为其提供计算数据。

from copy import deepcopy

class AbundanceFrame(pd.DataFrame):
'Subclass of DataFrame used for creating simulated dataset with various component timeseries'

def __init__(self, days,steps=0,monotonic=0,*args,**kw):
    'Constructor for AbundanceFrame class, must pass index of timeseries'
    super(AbundanceFrame,self).__init__(index = days,*args,**kw)
    self.steps = steps
    self.monotonic = monotonic

def apply_poisson_noise(self,keys=False):
    temp = deepcopy(self)
    if keys != False: 
        for key in keys:
            temp[key] = np.random.poisson(self[key])  
        temp =  AbundanceFrame(self.index, columns=self.columns, data = temp.values,
                               steps=self.steps, monotonic=self.monotonic)
    else: 
        temp =  AbundanceFrame(self.index, columns=self.columns, data = self.apply(np.random.poisson),
                               steps=self.steps, monotonic=self.monotonic)
    return temp