作为类的一部分向pandas.DataFrame()添加属性(函数)

时间:2019-04-02 11:38:30

标签: python-3.x pandas class

我觉得必须先问这个问题,但是我可能缺少搜索和描述我的问题的词汇。

我制作了一个Python3类,该类接受目录作为输入,并将大量数据收集到pandas.DataFrame中,这样我就可以做到这一点:

mymodule.myclass('/some/dir').get_tpm_values()

并获得带有一些列和行的pd.DataFrame,如下所示:

>>> seqit.Seqrun(41).get_tpm_values()
                 0041_P2017BB2S5R_S1  0041_P2017BB2S3R_S2  0041_P2017BB2S4R_S3  0041_P2017BB2S8R_S4  0041_P2017BB5S10R_S5
gene_id                                                                                                                  
ENSG00000000003                53.72                19.31                11.03                33.35                 14.55
ENSG00000000005                 1.05                 0.34                 0.19                 0.84                  0.12
ENSG00000000419                13.35                12.66                11.93                17.61                 22.82

现在,此DataFrame是一个特殊的DataFrame,它始终在索引中包含基因,并在列中包含样本。这样,我可以使属性作用于返回的DataFrame,而不作用于任何DataFrame。即,我希望能够将Hugo符号添加到这样的索引中并保存到Excel中:

mymodule.myclass('/some/dir').get_tpm_values().add_hugo_symbols_to_index().to_excel('some_excel.xlsx')

这意味着我需要向Pandas添加属性,但仅在班级内部,我将如何做?

编辑,发布部分课程可能会有所帮助

class Myclass():
    """
    A class that gives one a handle on a Snakemake sequencing data analysis
    folder
    """
    def __init__(self, seqrun_dir):
        if isinstance(seqrun_dir, int):
            self.seqrun_dir = self.number2seqrun(seqrun_dir)
        else:
            self.seqrun_dir = seqrun_dir   
        self.name = os.path.split(self.seqrun_dir)[-1]
        self.quantification_data_loaded = False
        self.pctpm_values_loaded = False
        self.load_sample_table()

    def get_tpm_values(self):
        """
        Get a pd.DataFrame with the TPM values from loaded quantification_data dictionary
        """
        if not self.quantification_data_loaded:
            self.get_quantification_data()
        self.tpm_values = dict()
        for sample in self.samples:
            try:
                self.tpm_values[sample] = self.quantification_data[sample]['TPM']
            except KeyError:
                print('Filling column', sample, 'with NaNs')
                self.tpm_values[sample] = np.nan
        self.tpm_values = pd.DataFrame(self.tpm_values)
        self.tpm_values_loaded = True
        return self.tpm_values

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则想向DataFrame-class添加一个方法。可以在Device admin deprecation

上找到对此的参考。

我认为,解决此问题的最佳方法是创建自己的DataFrame类,该类继承自pandas.DataFrame并实现其他功能。例如,请参见下面的代码:

class HugoDataFrame(pd.DataFrame):
    def add_hugo_symbols_to_index():
        pass # Do your stuff here

然后,您应该根据以下内容创建一个HugoDataFrame,而不是创建一个DataFrame并返回它:

self.tpm_values = HugoDataFrame(self.tpm_values)

您的另一种选择是将此功能简单地导出到一个单独的函数中,该函数采用一个数据框并对其进行修改

mymodule.myclass('/some/dir').get_tpm_values().add_hugo_symbols_to_index().to_excel('some_excel.xlsx')

您致电

add_hugo_symbols_to_index(mymodule.myclass('/some/dir').get_tpm_values()).to_excel('some_excel.xlsx')