Python中如何在带条件的For循环内计算标准差并新增偏差列
问题排查与修正方案
核心问题原因
- 条件判断列错误:需求为筛选
Volt.mv列超过0.95阈值的记录,现有代码错误判断了Time.s列的值是否大于0.95,直接导致if条件未按预期触发。 - 偏差赋值逻辑错误:循环内计算的
dev是全量Time.s列的统计值,属于全局固定值;且最终将单个dev值直接赋值给整个Deviation列,自然所有行的数值完全相同。 - 行对应逻辑缺失:仅将符合条件的时间值存入
ecg_dev列表,未和原表的行索引做关联,无法匹配到对应行填充偏差。
修正代码
推荐使用pandas向量化操作替代for循环,逻辑更清晰执行效率更高:
场景1:偏差为你原代码定义的全局固定值(全列时间标准差开方/时间均值)
import pandas as pd import numpy as np # 读取CSV文件 ecg = pd.read_csv("你的CSV文件路径.csv") # 预计算全局统计值 ecg_time_mean = ecg["Time.s"].mean() time_std_sqrt = ecg["Time.s"].std() ** 0.5 global_dev = time_std_sqrt / ecg_time_mean # 生成Deviation列:仅Volt.mv>0.95的行填充偏差,其余为空值 ecg["Deviation"] = np.where(ecg["Volt.mv"] > 0.95, global_dev, np.nan) # 导出符合阈值的记录可直接筛选 over_threshold_df = ecg[ecg["Volt.mv"] > 0.95] print(over_threshold_df) # 保存结果到新文件 ecg.to_csv("结果文件.csv", index=False)
场景2:偏差为单个时间值相对时间均值的相对偏差
如果你的需求是每个符合条件的时间值单独计算和时间均值的偏差,可修改偏差生成逻辑:
ecg_time_mean = ecg["Time.s"].mean() ecg["Deviation"] = np.where( ecg["Volt.mv"] > 0.95, (ecg["Time.s"] - ecg_time_mean) / ecg_time_mean, np.nan )
内容的提问来源于stack exchange,提问作者Valka
相关产品推荐
相关产品推荐

