数据框单行的单因素方差分析
我现在正在尝试对我的数据框的每一行进行单因素方差分析(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 个回答
2
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)。数据框有行索引和列名,而你这里似乎都没有用到,这可能说明你其实不需要用数据框。此外,行和列里的值被当作相同的东西来处理,但在数据框中通常不是这样的。所以,把 Subj1
做成一个 NumPy 数组可能会更合适,而不是用 Pandas 数据框。