Вычисление нескольких средневзвешенных значений на основе нескольких значений веса — Панды

#python #pandas #numpy #weighted-average

Вопрос:

Я довольно новичок в Python и понимаю, как работает np.average в целом, но я не могу понять, как заставить его работать для моего конкретного приложения. Я хочу создать разные средневзвешенные значения для строки df, основанные на разных весах.

Пример ниже:

 df=pd.DataFrame({'vals':[50,99,12,33],  'weight1':np.random.randint(0,50,4),  'weight2':np.random.randint(0,50,4),  'weight3':np.random.randint(0,50,4)})   vals weight1 weight2 weight3 0 50 39 11 9 1 99 37 17 27 2 12 22 29 0 3 33 39 17 47  

Я хочу создать столбец (в отдельном фрейме данных), который содержит средневзвешенное значение «vals» для каждого набора весов, которые я использую.

Таким образом, результат будет выглядеть примерно так:

 weights weightedvals 0 weight1 52.29 1 weight2 42.45 2 weight3 56.31  

Я понимаю, как получить эти средневзвешенные значения по отдельности, делая что-то вроде

 average(df['vals'], weights = df['weight1'])  

Но я застрял в том, как это сделать для нескольких значений веса. Я пробовал несколько решений, но они больше подходят для использования одного и того же веса для нескольких столбцов.

Спасибо!!

Ответ №1:

Возможно, вы ищете объект-генератор, что-то вроде этого:

 [np.average(df['vals'], weights=df[w]) for w in df.columns[1:]]  

сгенерирует список элементов, где первый элемент соответствует среднему значению, используя 'weight1' второй 'weight2' , и так далее. Вы можете прочитать его как сжатый цикл for, хотя это немного быстрее, чем использовать цикл for и добавлять значения в список. df.columns это просто список имен столбцов, так df.columns[1:] же как и список имен столбцов, в которых отсутствует первый элемент.

Поэтому, чтобы получить результат, который вы ищете, просто

 avg = [np.average(df['vals'], weights=df[w]) for w in df.columns[1:]] avg_df = pd.DataFrame({'weights' : df.columns[1:], 'weightedvals' : avg})  

Комментарии:

1. Спасибо!! Это сработало идеально. У меня возникли проблемы, когда я пытался понять, как исключить столбец из выполнения весов