微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我建立了一个Pandas数据框(下面的示例),该数据框由基因名称索引,该数据框具有列和整数的样本名称作为单元格值。我要执行的操作是对行值列表运行ANOVA(f_oneway(),从scipy.stats开始),该行值列表由与样本组相对应的列的列表定义。然后将这些结果存储在一个新的Pandas数据框中,该数据框中的组名称为列,索引的基因相同。

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

import pandas as pd
counts = {'sample1' : [0,1,5,10],'sample2' : [2,10,0],'sample3' : [0,'sample4' : [10,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测试的结果(功效,显着性)写入stat_col中的列p_colsig中。对于gene1,它将向stats.f_oneway提供每个组例如 [[0,2],[0,10]]中样本值列表的列表。

谢谢!

解决方法

尝试一下:

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
,

自从您提到以来,您希望将结果存储在数据框中:

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))

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。