pandas:如何在groupby对象上应用scipy.stats测试?

时间:2014-10-05 13:21:03

标签: python pandas scipy

我有一个这样的数据框:

   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'

由于

2 个答案:

答案 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测试只需要值列,groupbyDataFrame拆分为(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())