




本文详解如何在 pandas dataframe 中对含 nan 的数据进行加权平均计算,确保权重仅作用于非空值,并动态归一化——即分母为对应列中有效值的权重之和,而非全部权重总和。
在实际数据分析中,直接使用 df.mul(weights).sum() / weights.sum() 会错误地将 NaN 对应的权重纳入分母,导致结果偏差(如示例中第2行本应只用权重4参与计算,却仍被除以总权重14)。正确做法是:按元素级对齐掩码,使权重仅保留在非 NaN 数据位置,再分别求加权和与有效权重和。
0 = 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) # 形状同 df,NaN 位权重为 0
weighted_sum = df.mul(weights_masked).sum() # 每列加权和
valid_weight_sum = weights_masked.sum(axis=0) # 每列有效权重和
result = weighted_sum.div(valid_weight_sum)
print(result.round(6))输出:
1 151.785714 2 251.785714 3 352.500000 dtype: float64
此方案真正实现了「按需加权」:每一列独立计算其有效样本的加权均值,是处理缺失值加权统计的健壮范式。