Я тяну мои волосы на этом.

У меня есть 2 датафрейма:

Df1 содержит данные об игроках с их позицией (зоной) (нападающий, полузащитник или защитник) и некоторыми их

Игровая статистика.

df1 = pd.DataFrame({'Zone': ['DEF', 'MID', 'FWD'], 'Tackles': [5, 10, 5], 'Goals': [0, 1, 1], 'Shots': [10, 5, 2]} , index=(['Player A', 'Player B', 'Player C']))

         Zone  Tackles  Goals  Shots
Player A  DEF        5      0     10
Player B  MID       10      1      5
Player C  FWD        5      1      2

Df2 содержит вес, который я хочу применить для расчета индекса производительности для каждого игрока. Веса зависят от позиций игроков

df2 = pd.DataFrame({'Tackles': [1, 2, 4], 'Goals': [10, 5, 2], 'Shots': [3, 3, 1]}, index=(['FWD', 'MID', 'DEF']))

     Tackles  Goals  Shots
FWD        1     10      3
MID        2      5      3
DEF        4      2      1

Я хотел бы умножить каждую строку в df1 на соответствующую строку в df2

Вот что я хочу получить:

         Zone  Tackles  Goals  Shots  Index
Player A  DEF        5      0     10    30.0 (5*4 + 0*2 + 10*1)
Player B  MID       10      1      5    40.0 (10*2 + 1*5 +5*3)
Player C  FWD        5      1      2    21.0 (5*1 + 1*10 +2*3)

Я пробовал вот что:

df1['Index'] = (df1 * df2.loc[df1['Zone']]).sum(axis=1)

Но не работает ...

Заранее большое спасибо за вашу помощь

1
vianneydubs 10 Янв 2022 в 19:20

1 ответ

Лучший ответ

Добавить временный Zone в качестве индекса df1:

df1['Index'] = df1.set_index('Zone', append=True).mul(df2, level=1).sum(axis=1).values
print(df1)

# Output
         Zone  Tackles  Goals  Shots  Index
Player A  DEF        5      0     10     30
Player B  MID       10      1      5     40
Player C  FWD        5      1      2     21
0
Corralien 10 Янв 2022 в 19:33
@vianneydubs. Я обновил свой ответ. Теперь я думаю, что это правильно. Не могли бы вы проверить это, пожалуйста.
 – 
Corralien
10 Янв 2022 в 19:35
Оно работает!! Спасибо.
 – 
vianneydubs
10 Янв 2022 в 19:40