How to Calculate a Weighted Average in Pandas?

A weighted average in Pandas can be calculated by first creating a data frame containing all the necessary values, then applying the appropriate weights, and finally using the pandas.DataFrame.mean() function to calculate the weighted average. This allows you to easily calculate a weighted average in Pandas, helping to quickly and accurately analyze data.


You can use the following function to calculate a weighted average in Pandas:

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

The following examples show how to use this syntax in practice.

Example 1: Weighted Average in Pandas

The following code shows how to use the weighted average function to calculate a weighted average for a given dataset, using “price” as the values and “amount” as the weights:

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

The weighted average of “price” turns out to be 9.706.

Example 2: Groupby and Weighted Average in Pandas

The following code shows how to use the weighted average function to calculate the weighted average of price, grouped by sales rep:

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

We can see the following:

  • The weighted average of “price” for sales rep A is 5.833.
  • The weighted average of “price for sales rep B is 11.818.

x