我目前正在尝试为我的数据框的每一行运行单向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]]))
答案 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。