Как вы итеративно присваиваете веса столбцам фрейма данных для средневзвешенного среднего?

#python #pandas #dataframe #weighted-average

Вопрос:

У меня есть фрейм данных с несколькими столбцами, имеющими числовые значения с плавающей точкой. Что я хочу сделать, так это дать дробные веса каждому столбцу и вычислить его среднее значение, чтобы сохранить и добавить его в один и тот же df.

Допустим, у нас есть столбцы: s1, s2, s3. Я хочу присвоить им веса: w1, w2, w3 соответственно

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

Код, который не сработал:

 score_df["weighted_avg"]  = weight * score_df[feature]
 

Ручной код, который работал, но не со списками:

 df["weighted_scores"] = 0.5*df["s1"]   0.25*df["s2"]   0.25*df["s3"]
 

Ответ №1:

Для этого мы можем использовать широковещание numpy, так как веса имеют ту же форму, что и ось вашего столбца:

 # given the following example df
df = pd.DataFrame(np.random.rand(10,3), columns=["s1", "s2", "s3"])

print(df)
    s1   s2   s3
0 0.49 1.00 0.50
1 0.65 0.87 0.75
2 0.45 0.85 0.87
3 0.91 0.53 0.30
4 0.96 0.44 0.50
5 0.67 0.87 0.24
6 0.87 0.41 0.29
7 0.06 0.15 0.73
8 0.76 0.92 0.69
9 0.92 0.28 0.29
 
 weights = [0.5, 0.25, 0.25]
df["weighted_scores"] = df.mul(weights).sum(axis=1)

print(df)
    s1   s2   s3  weighted_scores
0 0.49 1.00 0.50             0.62
1 0.65 0.87 0.75             0.73
2 0.45 0.85 0.87             0.66
3 0.91 0.53 0.30             0.66
4 0.96 0.44 0.50             0.71
5 0.67 0.87 0.24             0.61
6 0.87 0.41 0.29             0.61
7 0.06 0.15 0.73             0.25
8 0.76 0.92 0.69             0.78
9 0.92 0.28 0.29             0.60
 

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

1. Это именно то, что я искал. Не могу поверить, что для этого был способ, большое спасибо!

Ответ №2:

Вы можете использовать dot

 import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,3), columns=["s1", "s2", "s3"])

df['weighted_scores'] = df.dot([.5,.25,.25])
df
 

Из

          s1        s2        s3  weighted_scores
0  0.053543  0.659316  0.033540         0.199985
1  0.631627  0.257241  0.494959         0.503863
2  0.220939  0.870247  0.875165         0.546822
3  0.890487  0.519320  0.944459         0.811188
4  0.029416  0.016780  0.987503         0.265779
5  0.843882  0.784933  0.677096         0.787448
6  0.396092  0.297580  0.965454         0.513805
7  0.109894  0.011217  0.443796         0.168700
8  0.202096  0.637105  0.959876         0.500293
9  0.847020  0.949703  0.668615         0.828090
 

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

1. Функция точки предназначена для векторов справа. Не знал, что его можно использовать и здесь, спасибо!