Панды - Роллинг на месте изменить форму - PullRequest
0 голосов
/ 14 октября 2019

У меня большой фрейм данных, которым я не могу поделиться здесь. Есть 509762 строк и 49 столбцов. Это данные временного ряда, и все 22 * ​​1006 * последовательных строк имеют одинаковый идентификатор. Я пытаюсь сделать эти 22 * ​​1008 * строк одной строкой, и у меня есть ограничения по времени.

play_ids = df_train['PlayId'].unique()
df_train_plays = pd.DataFrame(np.zeros((len(play_ids), 385)))

player_features = ['Team', 'X', 'Y', 'S', 'A', 'Dis', 'Orientation', 'Dir', 'NflId', 'DisplayName', 'JerseyNumber', 'PlayerHeight', 'PlayerWeight', 'PlayerBirthDate', 'PlayerCollegeName', 'Position']
# Repeating Non-player features after flattening the play_df
play_cols_to_drop = [49, 50, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97]

for i, play in enumerate(play_ids):
    # Iterating over play_ids and making vectors from them
    play_df = df_train[df_train['PlayId'] == play].values.flatten()
    play_df = pd.DataFrame(play_df).T

    # Dropping the repeating non-player features 
    for col in play_cols_to_drop:
        cols = [i for i in range(col, 1078, 49)]
        play_df.drop(columns=cols, inplace=True)

    # Writing the values of new vector into the df_train_plays
    # This is the part which takes most of time... It has to be done inplace
    df_train_plays.loc[i, :] = play_df.values[0]
    print(f'Reshaped Play {i}')

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

Я переключился на другой подход на месте и сделал из этих данных огромный вектор. Имеет 23,9 миллионов строк. На этот раз я должен преобразовать каждые 1034 строк в столбец. Как я могу сделать это без зацикливания?

df_train_plays = df_train.set_index(['PlayId', 'Team'])

pd.concat([df_train_plays[col] for col in df_train_plays])
...