Группировка и агрегирование большого набора данных по нескольким столбцам

#python #python-3.x #pandas #numpy #pandas-groupby

#python #python-3.x #pandas #numpy #pandas-groupby

Вопрос:

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

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

 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
  

Я хочу сгруппировать строки с похожими именами и адресной информацией, а затем объединить столбцы «источника» с 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 принимая максимальные значения из исходного фрейма данных.

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

Комментарии:

1. Потребуется некоторое время для группировки и сортировки миллионов записей, есть ли индекс в базовой таблице базы данных? Если нет, рассмотрите возможность создания представления на основе вашего запроса

2. Может быть, попробуйте выполнить сортировку перед использованием groupby? df.sort_values(['Firstname', 'Lastname', 'Address', 'Zip5'], inplace=True)

3. сколько времени требуется для подмножества строк 100K?

4. кроме того, сколько уникальных значений у вас есть в каждом из groupby() столбцов?

5. можете ли вы попробовать запустить его без as_index=False ? Если он не завершится через 50 минут, то, скорее всего, это ошибка / неоптимальная реализация в pandas. В этом случае вы можете обойти это путем группировки меньших подмножеств, объединения и повторной группировки

Ответ №1:

Я не знаю, будет ли это быстрее, поскольку я не знаю, работают ли 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()
  

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