
本文介绍如何通过循环和列索引批量对dataframe中连续数值列执行shapiro-wilk正态性检验,避免重复书写冗长代码,提升分析效率与可维护性。
本文介绍如何通过循环和列索引批量对dataframe中连续数值列执行shapiro-wilk正态性检验,避免重复书写冗长代码,提升分析效率与可维护性。
在探索性数据分析(EDA)中,常需对多个数值型变量进行正态性检验(如Shapiro-Wilk检验),尤其在决定后续使用参数检验(t检验、ANOVA)还是非参数方法时至关重要。面对多个目标列(如 "AIDS_Death_Rate", "AIDS_Death", "HIV_Incidence_Rate", "New_HIV_Cases"),逐一手动调用 shapiro() 不仅繁琐,还易出错、难复用。
幸运的是,Pandas DataFrame 的列索引支持切片操作,结合 Python 循环即可优雅实现批量处理。注意:原问题中误将 shapiro 拼写为 shaphiro,需修正;同时 df3.columns[3:7] 对应第4–7列(Python切片左闭右开),恰好覆盖这4个连续目标变量(假设其按顺序排列在索引3–6位置)。
以下为推荐写法(含错误处理与结果解读建议):
from scipy.stats import shapiro
# 定义目标列范围(按位置索引)
target_cols = df3.columns[3:7] # 等价于 ['AIDS_Death_Rate', 'AIDS_Death', 'HIV_Incidence_Rate', 'New_HIV_Cases']
# 批量执行Shapiro检验,结果存入字典
norm_results = {}
for col in target_cols:
series_clean = df3[col].dropna()
if len(series_clean) 0.05
norm_results[col] = (stat, p_value, is_normal)
except Exception as e:
norm_results[col] = ("Error", str(e), None)
print(f"❌ {col}: 计算异常 — {e}")
# 可视化汇总结果
print("\n? Shapiro-Wilk 正态性检验结果汇总:")
print("-" * 50)
for col, (stat, p_val, normal) in norm_results.items():
status = "✅ 正态分布" if normal is True else "❌ 非正态" if normal is False else f"⚠️ {stat}"
print(f"{col:20} | 统计量: {stat:.4f} | p值: {p_val:.4f} | 判定: {status}")
关键注意事项:
- ✅ 样本量限制:shapiro() 要求输入长度 ≥3 且 ≤5000;若列中缺失值过多导致有效样本不足,需提前过滤或改用其他检验(如K-S检验)。
- ✅ 数据类型校验:确保目标列为数值型(pd.api.types.is_numeric_dtype(df3[col])),避免因字符混入引发报错。
- ✅ 结果解释:p > 0.05 通常接受“数据服从正态分布”的零假设;但小样本下统计功效低,建议结合Q-Q图辅助判断。
- ✅ 扩展性优化:可进一步封装为函数,支持传入列名列表、自定义α阈值或并行计算。
通过此方法,代码简洁性、可读性与鲁棒性显著提升,真正实现“一次定义,批量执行”,是数据科学工作流中的实用工程实践。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










