0

0

如何在 Pandas 中正确计算含 NaN 值的加权平均(动态权重归一化)

心靈之曲

心靈之曲

发布时间:2025-12-31 14:43:03

|

532人浏览过

|

来源于php中文网

原创

如何在 Pandas 中正确计算含 NaN 值的加权平均(动态权重归一化)

本文详解如何在 pandas dataframe 中对含 nan 的数据进行加权平均计算:跳过 nan 对应的权重,仅用有效值对应的权重之和作为分母,避免将 nan 视为 0 导致分母恒定、结果失真。

在使用 Pandas 进行加权统计时,一个常见误区是直接用 df.mul(weights).sum() / weights.sum() —— 这种写法会隐式将 NaN 对应的权重保留并参与分母计算,导致分母固定为全部权重之和(如示例中的 14),而分子中 NaN 项被当作 0 处理,最终结果在含 NaN 的行上被低估或错误平滑。

正确的做法是:让权重与数据“同步失效”。即仅保留数据非空(notna())位置上的权重,其余位置权重置为 0。这样,加权和的分子与分母均只反映实际有效观测。

具体实现分两步:

  1. 构造掩码权重矩阵:利用 df.notna() 生成布尔 DataFrame,再与权重 Series 按行广播相乘,得到与 df 形状一致、NaN 位置权重为 0 的加权掩码:

    weights_masked = df.notna().mul(s, axis=0)
  2. 计算动态加权平均:用原始数据乘以掩码权重求和(自动忽略 NaN),再逐列除以该列对应的有效权重和:

    HTTPie AI
    HTTPie AI

    AI API开发工具

    下载
    result = df.mul(weights_masked).sum().div(weights_masked.sum(axis=0))

完整可运行示例:

import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({
    1: [100, 150, 175],
    2: [200, 250, 275],
    3: [300, np.nan, 375]
}, index=[1, 2, 3])

s = pd.Series([3, 4, 7], index=[1, 2, 3])

# 正确计算:权重随 NaN 动态屏蔽
weights_masked = df.notna().mul(s, axis=0)
result = df.mul(weights_masked).sum().div(weights_masked.sum(axis=0))

print(result.round(2))
# 输出:
# 1    151.79
# 2    251.79
# 3    352.50
# dtype: float64

✅ 关键要点总结:

  • df.notna() 返回同形状布尔 DataFrame,精准标识非空位置;
  • mul(s, axis=0) 实现按行广播,使每行权重独立应用;
  • weights_masked.sum(axis=0) 按列求和,得到每列(即每个指标)实际参与加权的权重总和(如第 3 列:3+7=10,跳过第 2 行的 NaN);
  • 此方法天然支持多列、任意索引,且无需循环或 apply,性能高效、语义清晰。

⚠️ 注意事项:若需结果为 DataFrame(而非 Series),可用 result.to_frame().T 转置;若原始数据含全 NaN 列,weights_masked.sum(axis=0) 可能为 0,需额外处理除零警告(例如 .replace(0, np.nan))。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

49

2025.12.04

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

29

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

本专题整合了ASCII码相关内容,阅读专题下面的文章了解更多详细内容。

31

2025.12.30

GPS是什么
GPS是什么

本专题整合了GPS相关内容,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

wifi拒绝接入
wifi拒绝接入

本专题整合了wifi拒绝接入相关教程,阅读下面的文章了解更多详细方法。

10

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 39.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号