我有一个这样的数据框:
1 2
0 P 214233
1 P 130435
2 P 258824
3 P 75488
4 C 101215
5 C 105793
6 C 101591
我想进行一次Wilcoxon秩和检验。为什么以下命令不起作用?
import scipy.stats as ss
df.groupby(1).apply(ss.ranksums)
我认为它不起作用,因为scipy无法识别该组:
TypeError: ranksums() takes exactly 2 arguments (1 given)
如何实现这一目标?无需手动执行groupby:
ss.ranksums(df[df[1]=="C"][2], df[df[1]=="P"][2])
与ANOVA的某些问题相同:
如果数据框如下:
1 2
0 P 214233
1 P 130435
2 A 258824
3 A 75488
4 A 101215
5 C 105793
6 C 101591
但这里的错误是:
TypeError: can't multiply sequence by non-int of type 'str'
由于
答案 0 :(得分:2)
这很有效。
values_per_group = [col for col_name, col in df.groupby(1)[2]]
ss.ranksums(*values_per_group)
答案 1 :(得分:0)
@ innohead方法的解释是scipy.stats
测试只需要值列,groupby
将DataFrame
拆分为(group_name, DataFrame)
元组。给定组列1
和值列2
,您可以将list comprehension与groupby对象df.groupby(1)
一起使用,仅提取值列df.groupby(1)[2]
,然后遍历groupby元组保留值(col
)并丢弃名称(col_names
)。
除了使用列表推导之外,您还可以使用dict理解将变量名称附加到值:
values_per_group = {col_name:col for col_name, col in df.groupby(1)[2]}
ss.ranksums(*values_per_group.values())