Comment calculer une moyenne pondérée chez les pandas



Vous pouvez utiliser la fonction suivante pour calculer une moyenne pondérée dans Pandas :

def w_avg(df, values, weights):
    d = df[values]
    w = df[weights]
    return (d * w).sum() / w.sum()

Les exemples suivants montrent comment utiliser cette syntaxe dans la pratique.

Exemple 1 : Moyenne pondérée chez les pandas

Le code suivant montre comment utiliser la fonction de moyenne pondérée pour calculer une moyenne pondérée pour un ensemble de données donné, en utilisant « prix » comme valeurs et « montant » comme pondération :

import pandas as pd

#create DataFrame
df = pd.DataFrame({'sales_rep': ['A', 'A', 'A', 'B', 'B', 'B'],
                   'price': [8, 5, 6, 7, 12, 14],
                   'amount': [1, 3, 2, 2, 5, 4]})

#view DataFrame
df

	sales_rep  price  amount
0	A	   8	  1
1	A	   5	  3
2	A	   6	  2
3	B	   7	  2
4	B	   12	  5
5	B	   14	  4

#find weighted average of price
w_avg(df, 'price', 'amount')

9.705882352941176

La moyenne pondérée du « prix » s’avère être de 9,706 .

Exemple 2 : Groupby et moyenne pondérée chez Pandas

Le code suivant montre comment utiliser la fonction de moyenne pondérée pour calculer la moyenne pondérée des prix, regroupés par commercial :

import pandas as pd

#create DataFrame
df = pd.DataFrame({'sales_rep': ['A', 'A', 'A', 'B', 'B', 'B'],
                   'price': [8, 5, 6, 7, 12, 14],
                   'amount': [1, 3, 2, 2, 5, 4]})

#find weighted average of price, grouped by sales rep
df.groupby('sales_rep').apply(w_avg, 'price', 'amount')

sales_rep
A     5.833333
B    11.818182
dtype: float64

Nous pouvons voir ce qui suit :

  • La moyenne pondérée du « prix » pour le commercial A est de 5,833 .
  • La moyenne pondérée du « prix du représentant commercial B » est de 11,818 .

Ressources additionnelles

Comment comparer deux colonnes dans Pandas
Comment calculer la somme des colonnes dans Pandas
Comment calculer la moyenne des colonnes dans Pandas

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *