#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. Спасибо!! Это сработало идеально. У меня возникли проблемы, когда я пытался понять, как исключить столбец из выполнения весов