如何解决按组将函数应用于Pandas数据框中的每一行
我建立了一个Pandas
数据框(下面的示例),该数据框由基因名称索引,该数据框具有列和整数的样本名称作为单元格值。我要执行的操作是对行值列表运行ANOVA(f_oneway()
,从scipy.stats
开始),该行值列表由与样本组相对应的列的列表定义。然后将这些结果存储在一个新的Pandas
数据框中,该数据框中的组名称为列,索引的基因相同。
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_col
和sig
中。对于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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。