【发布时间】: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_col 和p_col 列。对于gene1,它将为stats.f_oneway 提供每组中样本值列表的列表例如 [[0,2],[0, 10]]。
提前致谢!
【问题讨论】:
标签: python pandas dataframe scipy anova