Быстрый метод для pivot_table () и объединения в Pandas - PullRequest
0 голосов
/ 19 октября 2019

У меня есть следующий код:

counter = 0
for assignid in tqdm(selectedTests['assignids'].unique()):
    selectedTestsForAssignID = selectedTests[selectedTests['assignids']==assignid]
    for memberid in selectedTestsForAssignID['memberid'].unique():
        selectedTestsPivotCorrectTemp = selectedTestsForAssignID[selectedTestsForAssignID['memberid']==memberid].pivot_table(index=['memberid'],
                                                                                                                 columns=['col1', 'col2'],
                                                                                                                 values='col3', aggfunc=np.max)
        if counter == 0:
            selectedTestsPivotCorrect = selectedTestsPivotCorrectTemp
        else:
            selectedTestsPivotCorrect = pd.concat([selectedTestsPivotCorrect, selectedTestsPivotCorrectTemp], axis=0, join='outer')
        counter = counter + 1

В приведенном выше коде я пытаюсь создать сводную таблицу для каждого memberid и объединяю ее с главной сводной таблицей с именем selectedTestsPivotCorrect. У меня в общей сложности 1000 assignids, и каждый assignid будет иметь в среднем 20-25 memberids. Число столбцов после поворота для каждого memberid должно составлять в среднем около 30.

Даже если этот код работает просто отлично, он работает довольно медленно. Бег занимает более 1,5 часов. У меня есть чувство, что это можно сделать гораздо более эффективным способом, но я не знаю, как.

Я также пытался создать сводную таблицу для каждого назначенного за один выстрел (не повторяя каждый memberid), но это обычно дает мне ту или иную ошибку, которая при поиске в Google обнаружила, что она связана с проблемами с памятью.

Код начинает выполняться дольше после нескольких итераций на assignids, так какглавная сводная таблица становится больше.

После всего этого я хотел бы создать сводную таблицу с индексом memberid, столбцами ['col1','col2'] и значениями col3.

Любые предложения по ускорению работы этого кода приветствуются.

TIA.

1 Ответ

0 голосов
/ 19 октября 2019

Почему именно вы делаете вложенный цикл? Смысл pivot_table в том, что вам не нужно это делать:

df.pivot_table(index=['assignid', 'memberid'],
               columns=['col1', 'col2'],
               values='col3',
               aggfunc='max')

Работает ли groupby().agg().unstack() для вас?

(df.groupby(['assignid', 'memberid', 'col1', 'col2'])
     ['col3'].max()
     .unstack(['col1','col2'])
)

Я несколько раз проверял, и это выглядиткак pivot_table.

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