#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. Функция точки предназначена для векторов справа. Не знал, что его можно использовать и здесь, спасибо!