加权平均值 - 如果缺少数值或重量,则省略数据

时间:2017-03-17 09:35:56

标签: pandas missing-data weighted-average

我有这样的代码

>>> 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中使用单个表达式,请提供帮助。

1 个答案:

答案 0 :(得分: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