【问题标题】:Weighted Average - omit data if missing from value or weight加权平均 - 如果值或权重缺失,则忽略数据
【发布时间】:2017-03-17 09:35:55
【问题描述】:

我有这样的代码

>>> import pandas as pd
>>> import numpy as np
>>> 
>>> df1 = pd.DataFrame({'value':[10,20,np.nan,40],
...                         'weight':[1,np.nan,3,4]}) 
>>> df1
   value  weight
0   10.0     1.0
1   20.0     NaN
2    NaN     3.0
3   40.0     4.0
>>> (df1["value"] * df1["weight"]).sum() / df1["weight"].sum()
21.25

如果缺少值或重量,我想从计算中省略数据。即我想要像这样的加权平均值 (10*1 + 40*4) /(1+4) = 34

如果可以在 pandas 中使用单个表达式,请提供帮助。

【问题讨论】:

    标签: pandas missing-data weighted-average


    【解决方案1】:

    您可以先使用boolean indexing 进行过滤,掩码由notnullall 创建,用于检查每行的所有True 值:

    df1 = df1[df1.notnull().all(axis=1)]
    print (df1)
       value  weight
    0   10.0     1.0
    3   40.0     4.0
    
    df2 = (df1["value"] * df1["weight"]).sum() / df1["weight"].sum()
    print (df2)
    34.0
    

    或者分别检查两列:

    df1 = df1[df1["value"].notnull() & df1["weight"].notnull()]
    print (df1)
       value  weight
    0   10.0     1.0
    3   40.0     4.0
    

    dropna 更简单的解决方案:

    df1 = df1.dropna()
    print (df1)
       value  weight
    0   10.0     1.0
    3   40.0     4.0
    

    或者如果有必要指定列:

    df1 = df1.dropna(subset=['value','weight'])
    print (df1)
       value  weight
    0   10.0     1.0
    3   40.0     4.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多