Pandas DataFrame: как получить среднее значение столбца, но принимая во внимание только те строки, индекс которых ниже, чем тот, который я хочу получить среднее

1

Проблема, которую я имею, это то, что я хочу предсказать победу команды над другой, сделать то, что я хочу иметь для каждого матча winrate каждой команды до даты матча.

Однако использование df.groupBy("teamName").agg({"isVictory":"mean"}) предоставляет мне глобальный wirate команды, который не используется, потому что вы не должны знать winrate всех матчей на этом мгновенный.

Поэтому я хотел бы получить winrate совпадений до этого, зная, что у меня есть index столбца в моем DataFrame, который поддерживает порядок совпадения (т.е. Если индекс совпадения меньше, чем индекс текущее совпадение означает, что матч был сделан ранее, поэтому этот матч следует рассматривать в среднем)

Обратите внимание, что мои столбцы:

indexMatch, nameTeam, isVictoryTeam

(isVictoryTeam = если Team1 выиграл и 0, если команда проиграла)

пример набора данных:

   IndexMatch  isVictoryTeam team   winrate
0           1              1    a       NaN
1           2              0    a         1
2           3              1    a       0.5
3           4              1    a    0.6667

Ожидается результат winrate.
Спасибо заранее за вашу помощь.

  • 1
    Не могли бы вы привести пример вашего фрейма данных и желаемый результат?
Теги:
pandas
aggregate
mean
group-by

1 ответ

1
Лучший ответ

Должен быть лучший способ, но это работает:

df = pd.DataFrame({'team': [' a', ' a', ' a', ' a', 'b', 'b', 'c'],
                   'IndexMatch': [1, 2, 3, 4, 5, 6, 7],
                   'isVictoryTeam': [1, 0, 1, 1, 0, 1, 1]})
df['winrate'] = df.groupby('team')['isVictoryTeam'].expanding().mean().reset_index().groupby('team')['isVictoryTeam'].shift().reset_index(drop=True)
df
#   IndexMatch  isVictoryTeam team   winrate
#0           1              1    a       NaN
#1           2              0    a  1.000000
#2           3              1    a  0.500000
#3           4              1    a  0.666667
#4           5              0    b       NaN
#5           6              1    b  0.000000
#6           7              1    c       NaN
  • 0
    Спасибо, это именно то, что я хотел!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню