【问题标题】:Adding an attribute (function) to pandas.DataFrame() as part of a class将属性(函数)添加到 pandas.DataFrame() 作为类的一部分
【发布时间】:2019-04-02 21:11:30
【问题描述】:

我觉得这一定是以前问过的,但我可能缺乏搜索和描述我的问题的词汇。

我创建了一个 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

【问题讨论】:

  • 我觉得你的问题有点令人困惑。根据我的理解(或认为我理解),您想向 pandas.DataFrame 类添加一个函数,对吗?您抓取值,使用基因,想要添加 Hugo 符号(无论是什么),导出到 excel 等。只会让读者感到困惑。事实上,涉及 DataFrames 和 pandas 甚至可能是不必要的。您想要做的(确切地说)是将方法(函数)添加到现有类(DataFrame-class)

标签: python-3.x pandas class


【解决方案1】:

如果我正确理解您的问题,您想向 DataFrame 类添加一个方法。可以在here 找到相关参考

在我看来,解决这个问题的最好方法是创建自己的 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')

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多