数据框单行的单因素方差分析

0 投票
1 回答
1834 浏览
提问于 2025-04-18 12:33

我现在正在尝试对我的数据框的每一行进行单因素方差分析(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 数据框。

撰写回答