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),再逐列除以该列对应的有效权重和:

    NewsBang
    NewsBang

    盛大旗下AI团队推出的智能新闻阅读App

    下载
    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 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

84

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

24

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

56

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

热门下载

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

精品课程

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

共578课时 | 46.9万人学习

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

共12课时 | 1.0万人学习

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

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