Oneway Anova的各行Dataframe

时间:2014-07-08 19:33:48

标签: python loops anova

我目前正在尝试为我的数据框的每一行运行单向ANOVA(有519行,每行代表不同的生物类群,每列代表不同的样本);但是我不断得到一个无效的语法错误,我相信我的错误在于我选择的行。我是python和pandas的新手,所以这就是我到目前为止,Subj1是我的数据帧的名称:

for x in range(0,24):
    print(scipy.stats.f_oneway(Subj1.iloc[[x,:],:]))

我将如何遍历行以便返回每行的anova值?

提前致谢!

编辑:我试图将数据框转换为值然后像这样运行迭代无济于事:(:

Subject1Values=Subj1.values
for x in range(0,24):
    print(scipy.stats.f_oneway(Subj1Values[x]))

编辑2:我试过了,但它仍然多次返回(nan,nan):

Subj1Values=Subj1.values
for i in range(0,24):
    print(stats.f_oneway(Subj1Values[[i],[0]],Subj1Values[[i],[1]],Subj1Values[[i],[2]],Subj1Values[[i],[3]],Subj1Values[[i],[4]],Subj1Values[[i],[5]]))

1 个答案:

答案 0 :(得分:1)

itertools.product可以生成两个项目序列的笛卡尔积。例如,

In [4]: import itertools as IT

In [5]: list(IT.product([1,2,3], [4,5,6]))
Out[5]: [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

因此,要生成所有行和列对,可以使用

import itertools as IT
import scipy.stats as stats

arr = Subj1.values
rows = range(arr.shape[0])
columns = range(arr.shape[1])
for i,j in IT.product(rows, columns):
    print(stats.f_oneway(arr[i,:], arr[:,j]))

请注意,您的数据似乎更像数组而不是DataFrame。 DataFrames具有列的行和列名称的索引。你没有在这里使用其中任何一个,这表明你可能不需要使用DataFrame。而且,行和列中的值被定性地视为相同的事物。这通常不适用于DataFrame中的数据。所以你最好不要让Subj1成为NumPy数组而不是Pandas DataFrame。