如何用Pandas+Scipy mannwhitneyu自动分析各Type下Blue与Green的Spots差异
问题描述
现有包含Type、Color、Spots字段的大型数据表(示例数据如下):
Type Color Spots A Blue 792 A Blue 56 A Blue 2726 A Blue 780 A Blue 591 A Blue 2867 A Blue 193 A Green 134 A Green 631 A Green 1010 A Green 53 A Green 5826 A Green 6409 A Green 3278 B Blue 670 B Blue 42 B Blue 1165 B Blue 3203 B Blue 2164 B Blue 5876 B Blue 525 B Green 26 B Green 143 B Green 399 B Green 68 B Green 939 B Green 1528 B Green 401 B Green 1842 C Blue 265 C Blue 19 C Blue 1381 C Blue 4483 C Blue 1103 C Blue 1906 C Blue 691 C Green 38 C Green 149 C Green 87 C Green 33 C Green 1427 C Green 1009 C Green 342 C Green 190
需要针对每个Type,对Blue和Green对应的Spots数据执行Scipy的mannwhitneyu(曼-惠特尼U检验)分析,例如Type A的对比数据如下:
Blue Green 792 134 56 631 2726 1010 780 53 591 5826 2867 6409 193 3278
目标是通过Pandas分组后自动调用Scipy完成分析,获取每个Type对应的p值。
实现思路与代码
步骤1:导入依赖库
import pandas as pd from scipy.stats import mannwhitneyu
步骤2:加载数据
假设数据存储为制表符分隔的文本文件,读取到DataFrame;若为其他格式(如CSV、Excel),替换对应读取方法即可:
df = pd.read_csv('your_data.txt', sep='\t')
步骤3:分组批量执行检验
定义自定义函数处理单组数据,再通过groupby+apply实现全量自动化分析:
def compute_mannwhitneyu(group): # 拆分当前Type下Blue和Green的Spots数据 blue_data = group[group['Color'] == 'Blue']['Spots'] green_data = group[group['Color'] == 'Green']['Spots'] # 执行曼-惠特尼U检验,alternative参数按需选择双侧/单侧检验 _, p_val = mannwhitneyu(blue_data, green_data, alternative='two-sided') # 返回p值,可按需扩展返回统计量等信息 return pd.Series({'p_value': p_val}) # 按Type分组并应用检验逻辑 result_df = df.groupby('Type').apply(compute_mannwhitneyu).reset_index()
步骤4:查看结果
输出结果即可得到每个Type对应的检验p值:
print(result_df)
注意事项
- 确保每组
Type下同时存在Blue和Green的有效数据,可在自定义函数中添加判断逻辑处理缺失数据的异常情况。 mannwhitneyu的alternative参数可根据研究需求设置为'two-sided'(默认双侧)、'less'或'greater'。
内容的提问来源于stack exchange,提问作者Eusebio Perdiguero
相关产品推荐
相关产品推荐

