如何用Pandas计算排除指定标签外所有标签值的标准差?
解决方案
我们需要给DataFrame的每行计算排除当前行对应标签外,所有其他标签的val值的标准差。由于相同标签的行计算结果一致,先按标签批量计算再映射到行的方式会更高效。
步骤1:导入库并初始化DataFrame
import pandas as pd df = pd.DataFrame({'labels' : ['A','A', 'B', 'C', 'C'],'val' : [1, 2, 3, 4, 5]})
步骤2:按标签批量计算标准差
遍历所有唯一标签,为每个标签预计算对应其他标签数据的标准差,再将结果映射到原DataFrame:
# 构建标签与对应标准差的映射字典 std_map = {} for label in df['labels'].unique(): # 筛选当前标签以外的所有val值 other_vals = df.loc[df['labels'] != label, 'val'] # 计算标准差:ddof=0为总体标准差,默认ddof=1为样本标准差,可按需调整 std_map[label] = other_vals.std(ddof=0) # 将结果映射到原DataFrame的新列 df['other_labels_std'] = df['labels'].map(std_map)
步骤3:查看最终结果
运行后df会新增一列other_labels_std,具体结果如下:
| labels | val | other_labels_std |
|---|---|---|
| A | 1 | 0.816496580927726 |
| A | 2 | 0.816496580927726 |
| B | 3 | 1.5811388300841898 |
| C | 4 | 0.816496580927726 |
| C | 5 | 0.816496580927726 |
补充说明
- 若需要计算样本标准差(分母为n-1),直接使用
other_vals.std()即可,无需传入ddof=0参数。 - 这种批量计算的方式比逐行
apply效率更高,尤其在数据量较大时,每个标签仅需计算一次标准差,避免重复运算。
内容的提问来源于stack exchange,提问作者sra7687
相关产品推荐
相关产品推荐

