按组将函数应用于 Pandas 数据框中的每一行

And*_*res 7 python scipy dataframe anova pandas

我构建了一个Pandas由基因名称索引的数据框(下面的示例),其中包含列和整数的样本名称作为单元格值。我想要做的是对由与样本组对应的列列表定义的行值列表运行 ANOVA ( f_oneway(), from 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'])
Run Code Online (Sandbox Code Playgroud)

组作为参数导入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()))
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

dok*_*who 2

尝试这个:

group = ['sample1', 'sample2']
Run Code Online (Sandbox Code Playgroud)

在您的样品上:

data[group].T
Run Code Online (Sandbox Code Playgroud)

看起来喜欢:

    gene1   gene2   gene3   gene4   gene5
sample1     0   1   5   0   10
sample2     2   0   10  0   0
Run Code Online (Sandbox Code Playgroud)

最后:

anova = stats.f_oneway(*data[group].T.values)
print(anova.statistic, anova.pvalue)
Run Code Online (Sandbox Code Playgroud)

anova对象包含您期望的内容:

0.0853333333333 0.777628169862
Run Code Online (Sandbox Code Playgroud)