Pandas 数据帧上的 Mann–Whitney U 检验
Mann–Whitney U test on Pandas dataframe
我有一个类似于这个的大型数据框:
In [1]: grades
Out[1]:
course1 course2
school class student
school1 class1 student1 2 2
student2 3 2
student3 1 3
student4 3 1
student5 3 1
... ... ...
class3 student86 3 1
student87 2 2
student88 1 1
student89 3 3
student90 0 1
[90 rows x 2 columns]
我想计算样本学校和每个子样本的成绩的 Mann-Whitney 秩检验 class。如何在不遍历数据帧的情况下使用 pandas 和 scipy.stats.mannwhitneyu 执行此操作?
您想要做的是在索引级别 groupby
并应用调用 mannwhitneyu
的函数,传递两列 course1
和 course2
。假设这是您的数据:
index = pandas.MultiIndex.from_product([
['school{0}'.format(n) for n in xrange(3)],
['class{0}'.format(n) for n in xrange(3)],
['student{0}'.format(n) for n in xrange(10)]
])
d = pandas.DataFrame({'course1': np.random.randint(0, 10, 90), 'course2': np.random.randint(0, 10, 90)},
index=index)
然后按学校计算Mann-Whitney U:
>>> d.groupby(level=0).apply(lambda t: stats.mannwhitneyu(t.course1, t.course2))
school0 (426.5, 0.365937834646)
school1 (445.0, 0.473277409673)
school2 (421.0, 0.335714211748)
dtype: object
然后 class:
>>> d.groupby(level=[0, 1]).apply(lambda t: stats.mannwhitneyu(t.course1, t.course2))
school0 class0 (38.5, 0.200247279189)
class1 (37.0, 0.169040187814)
class2 (46.5, 0.409559639829)
school1 class0 (33.5, 0.110329749527)
class1 (47.5, 0.439276896563)
class2 (30.0, 0.0684355963119)
school2 class0 (47.5, 0.439438219083)
class1 (43.0, 0.308851989782)
class2 (34.0, 0.118791221444)
dtype: object
groupby
的 levels
参数中的数字指的是您的 MultiIndex 的级别。因此,按学校按级别 0 组分组,按 school/class 组合按级别 0 和 1 组分组。
我有一个类似于这个的大型数据框:
In [1]: grades
Out[1]:
course1 course2
school class student
school1 class1 student1 2 2
student2 3 2
student3 1 3
student4 3 1
student5 3 1
... ... ...
class3 student86 3 1
student87 2 2
student88 1 1
student89 3 3
student90 0 1
[90 rows x 2 columns]
我想计算样本学校和每个子样本的成绩的 Mann-Whitney 秩检验 class。如何在不遍历数据帧的情况下使用 pandas 和 scipy.stats.mannwhitneyu 执行此操作?
您想要做的是在索引级别 groupby
并应用调用 mannwhitneyu
的函数,传递两列 course1
和 course2
。假设这是您的数据:
index = pandas.MultiIndex.from_product([
['school{0}'.format(n) for n in xrange(3)],
['class{0}'.format(n) for n in xrange(3)],
['student{0}'.format(n) for n in xrange(10)]
])
d = pandas.DataFrame({'course1': np.random.randint(0, 10, 90), 'course2': np.random.randint(0, 10, 90)},
index=index)
然后按学校计算Mann-Whitney U:
>>> d.groupby(level=0).apply(lambda t: stats.mannwhitneyu(t.course1, t.course2))
school0 (426.5, 0.365937834646)
school1 (445.0, 0.473277409673)
school2 (421.0, 0.335714211748)
dtype: object
然后 class:
>>> d.groupby(level=[0, 1]).apply(lambda t: stats.mannwhitneyu(t.course1, t.course2))
school0 class0 (38.5, 0.200247279189)
class1 (37.0, 0.169040187814)
class2 (46.5, 0.409559639829)
school1 class0 (33.5, 0.110329749527)
class1 (47.5, 0.439276896563)
class2 (30.0, 0.0684355963119)
school2 class0 (47.5, 0.439438219083)
class1 (43.0, 0.308851989782)
class2 (34.0, 0.118791221444)
dtype: object
groupby
的 levels
参数中的数字指的是您的 MultiIndex 的级别。因此,按学校按级别 0 组分组,按 school/class 组合按级别 0 和 1 组分组。