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_col和p_col中sig。对于gene1,它将为stats.f_oneway 提供每个组中样本的值列表列表,例如 [[0,2],[0, 10]]。
提前致谢!
尝试这个:
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)