【问题标题】:Apply function to each row in Pandas dataframe by group按组将函数应用于 Pandas 数据帧中的每一行
【发布时间】:2021-01-11 20:29:34
【问题描述】:

我构建了一个由基因名称索引的Pandas 数据框(下面的示例),其中列的样本名称和整数作为单元格值。我想要做的是对由对应于样本组的列列表定义的行值列表运行方差分析(f_oneway(),来自scipy.stats)。然后将这些结果存储在一个新的Pandas 数据框中,其中组名作为列,相同的基因作为索引。

数据框的示例(它是从 my 中的另一个函数返回的):

import pandas as pd
counts = {'sample1' : [0, 1, 5, 0, 10],
        'sample2' : [2, 0, 10, 0, 0],
        'sample3' : [0, 0, 0, 1, 0],
        'sample4' : [10, 0, 1, 4, 0]}
data = pd.DataFrame(counts, columns = ['sample1', 'sample2', 'sample3', 'sample4'],
        index = ['gene1', 'gene2', 'gene3', 'gene4', 'gene5'])

main() 将组作为参数导入,所以在这个函数中我有:

def compare(out_prefix, pops, data):
    import scipy.stats as stats
    sig = pd.DataFrame(index=data.index)

#groups will look like:
#groups = [['sample1', 'sample2'],['sample3', 'sample4']]

    for group in groups:
        with open(group) as infile:
            groups_s = []
            for spl in infile:
                group_s.append(spl.replace("\n",""))

        mean_col = pop.split(".")[0]+"_mean"
        std_col = pop.split(".")[0]+"_std"
        stat_col = pop.split(".")[0]+"_stat"
        p_col = pop.split(".")[0]+"_sig"

        sig[mean_col] = data[group_s].mean(axis=1)
        sig[std_col] = data[group_s].std(axis=1)

        sig[[stat_col, p_col]] = data.apply(lambda row : stats.f_oneway(data.loc[group_s].values.tolist()))

最后一行不起作用,我无法通过过去几天的谷歌搜索看到它是如何完成的 - 有人能指出我正确的方向吗? 理想情况下,它会将每组中样本的每行 ANOVA 检验结果(功效、显着性)逐组写入sig 中的stat_colp_col 列。对于gene1,它将为stats.f_oneway 提供每组中样本值列表的列表例如 [[0,2],[0, 10]]

提前致谢!

【问题讨论】:

    标签: python pandas dataframe scipy anova


    【解决方案1】:

    试试这个:

    group = ['sample1', 'sample2']
    

    在您的样本上:

    data[group].T
    

    看起来像:

        gene1   gene2   gene3   gene4   gene5
    sample1     0   1   5   0   10
    sample2     2   0   10  0   0
    

    最后:

    anova = stats.f_oneway(*data[group].T.values)
    print(anova.statistic, anova.pvalue)
    

    anova 对象包含您所期望的:

    0.0853333333333 0.777628169862
    

    【讨论】:

      【解决方案2】:

      既然您提到您希望将结果存储在数据框中:

      def compare(data, list_of_samples):
          for group in list_of_samples:
              df = data[group].T
              anova = stats.f_oneway(*df.values)
              yield {"samples": group, "pval": anova.pvalue, "statistic": anova.statistic}
      
      groups = [["sample1", "sample2"],["sample3", "sample4"]]
      result = pd.DataFrame(compare(data, groups))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-30
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多