Группировка и агрегирование большого набора данных по нескольким столбцам - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь сгруппировать данные по нескольким столбцам, а затем объединить значения в другие столбцы.Хотя я нашел множество примеров этого в Интернете, я сталкиваюсь с проблемами, когда пытаюсь применить те же методы к моей DataFrame.Я думаю, это может быть связано с размером (1,5 мм + строки).

У меня есть DataFrame с информацией об имени и адресе, а также два столбца «источника»:

In [45]: df
Out[45]:
   Firstname   Lastname       Address     Zip5   Source_A  Source_B
0      'John'    'Smith'    '1 May St'  '10001'         1         0
1       'Lou'    'Brown'  '2 Perry Ln'  '20983'         0         1
2    'Elaine'    'Brown'  '5 Park Ave'  '34785'         1         0
3      'John'    'Smith'    '1 May St'  '10001'         0         1

Я хочу сгруппировать строки с аналогичной информацией об имени и адресе, а затем объединить столбцы 'source' с помощью функции max().Мой код выглядит следующим образом:

In [43]: grouped = df.groupby(['Firstname', 'Lastname', 'Address', 'Zip5'], as_index = False, sort = False)

In [44]: grouped.max()
Out[44]:
   Firstname   Lastname       Address     Zip5   Source_A  Source_B
0      'John'    'Smith'    '1 May St'  '10001'         1         1
1       'Lou'    'Brown'  '2 Perry Ln'  '20983'         0         1
2    'Elaine'    'Brown'  '5 Park Ave'  '34785'         1         0

Этот вывод - именно то, что я хочу - по сути, строки дедуплицируются на ['Firstname', 'Lastname', 'Address', 'Zip5'], при этом Source_A и Source_B принимают максимальные значения из оригиналаdataframe.

Однако, хотя это работает и для меньших DataFrames, код не завершает работу с очень большими наборами данных (строки 1,5 мм).Я запустил этот код в большом наборе данных около 45 минут назад, и он еще не закончен.Есть ли более эффективный способ сделать это?Мне также любопытно, почему простая идентификация дубликатов с помощью df.duplicated(['Firstname', 'Lastname', 'Address', 'Zip5'], keep = 'last') работает очень быстро, тогда как groupby борется.

1 Ответ

0 голосов
/ 23 апреля 2019

Я не знаю, будет ли это быстрее, потому что я не знаю, являются ли pivot_table или melt или их комбинация быстрее, чем при использовании groupby, но вот альтернативное решение

Я использовал функцию melt дляскладывать значения из Source_A и Source_B в один столбец

df_melt=pd.melt(df,id_vars=['Firstname','Lastname','Address','Zip5'],value_vars=['Source_A','Source_B'])

Затем применить сводную таблицу к результату

df_pivot=df_melt.pivot_table(index=['Firstname','Lastname','Address','Zip5'],columns='variable',aggfunc='max').reset_index()

Надеюсь, это поможет!

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