Эффективный расчет нового столбца данных на основе предыдущих строк - PullRequest
0 голосов
/ 14 октября 2019

У меня есть pandas dataframe результатов NBA, где каждая строка представляет игру и статистику конкретного игрока в течение этой игры. Вот небольшая выборка строк:

  League  Offensive Rebound %     Player_Name  ...  Blocks  Outcome     Age
0    NBA                  1.0  Alaa Abdelnaby  ...     0.0   W (+8)  25-211
1    NBA                  2.0  Alaa Abdelnaby  ...     2.0   W (+8)  25-214
2    NBA                  5.0  Alaa Abdelnaby  ...     1.0   W (+5)  25-216
3    NBA                  0.0  Alaa Abdelnaby  ...     0.0  W (+12)  25-220
4    NBA                  2.0  Alaa Abdelnaby  ...     0.0  L (-35)  25-222
5    NBA                  0.0  Alaa Abdelnaby  ...     0.0  L (-13)  25-223
6    NBA                  0.0  Alaa Abdelnaby  ...     0.0  L (-19)  25-238
7    NBA                  0.0  Alaa Abdelnaby  ...     0.0  L (-11)  25-240
8    NBA                  0.0  Alaa Abdelnaby  ...     0.0   L (-9)  25-241
9    NBA                  0.0  Alaa Abdelnaby  ...     0.0   L (-2)  25-243

[10 rows x 31 columns]

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

# Get a group for each player each season
grouped_game_data = game_data.groupby(['Season', 'Team', 'Player_Name'])
game_data['Team Wins'] = np.nan
game_data['Team Losses'] = np.nan

# Iterate through players per season
for name, group in grouped_game_data:
    # Keep track of current wins
    curr_wins = 0
    curr_losses = 0

    # Iterate through games in a season by player
    for idx, game in group.sort_values(by='Date').iterrows():
        game_data.loc[idx, 'Team Wins'] = curr_wins
        game_data.loc[idx, 'Team Losses'] = curr_losses

        if game['Outcome'][0] == 'W':
            curr_wins += 1
        elif game['Outcome'][0] == 'L':
            curr_losses += 1

Казалось, это работало нормально, но для запуска потребовалось некоторое время. Есть ли какой-либо способ векторизации этого кода или написание какого-то другого более эффективного метода, который достигает тех же результатов? Возможно, мне придется делать подобные операции позже, и я хотел бы, чтобы они занимали меньше времени. Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...