2017-03-17 4 views
1

je code comme ceciMoyenne pondérée - omettre les données manquantes si de la valeur ou du poids

>>> 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 

Je veux omettre les données de calcul si les valeurs ou le poids est manquant. je.je veux moyenne pondérée comme comme (10 * 1 + 40 * 4)/(1 + 4) = 34

S'il vous plaît aider si cela est possible en utilisant une seule expression dans les pandas.

Répondre

1

Vous pouvez filtrer d'abord avec boolean indexing, masque est créé par notnull et all pour vérifier toutes les True valeurs par ligne:

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 

Ou vérifier les deux colonnes séparément:

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

solution simplier avec dropna :

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

Ou si nécessaire, spécifier des colonnes:

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