Фрейм данных Pandas, группировка или цикл?

#python-3.x #pandas #dataframe #grouping

#python-3.x #pandas #фрейм данных #группировка

Вопрос:

У меня есть фрейм данных, который выглядит как:

           Col_A  | Col_B  
         -------- -------- 
Index   
-------- -------- --------  
Index_1 | XXXXX  | 0      |
-------- -------- -------- 
Index_2 | XXXXX  | 1      |
-------- -------- -------- 
Index_3 | XXXXX  | 2      |
-------- -------- -------- 
Index_4 | YYYYY  | 0      |
-------- -------- -------- 
Index_5 | YYYYY  | 1      |
-------- -------- -------- 
Index_6 | ZZZZZ  | 0      |
-------- -------- -------- 
          [....]
  

Мне нужен фрейм данных, который выглядит как:

           Col_A  | Col_B  
         -------- ------------------------------ 
Index   
-------- -------- ------------------------------  
Index_1 | XXXXX  | [Index_1, Index_2, Index_3]  | 
-------- -------- ------------------------------  
Index_4 | YYYYY  | [Index_4, Index_5]           |
-------- -------- ------------------------------ 
Index_6 | ZZZZZ  | [Index_6, ...]               |
-------- -------- ------------------------------ 
          [....]
  

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

Ответ №1:

 df.reset_index().groupby('Col_A') 
  .agg(dict(Index='first', Col_B=lambda x: list(x))) 
  .reset_index().set_index('Index')
  

введите описание изображения здесь

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

1. Этот ответ, скорее всего, быстрее, он выполняет только один вызов groupby . Если вы считаете иначе, было бы интересно узнать. Тем временем вы должны принять этот ответ.

Ответ №2:

Нет необходимости повторять, вы можете применить list напрямую:

 df.groupby('Col_A')['Col_B'].apply(list)
  

Обязательно выберите, 'Col_B' чтобы применить list к ряду, в противном случае list вернутся столбцы фрейма данных.


Редактировать

Вы можете сохранить исходный (первый) индекс следующим образом:

 original_index = df.reset_index(drop=False).groupby('Col_A')['Index'].first()
  

А затем объединить исходный индекс с предыдущим результатом:

 result = df.groupby('Col_A')['Col_B'].apply(list).join(original_index)
  

Наконец, вы можете поменять индексы с:

 result.reset_index(drop=False).set_index('Index')
  

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

1. Спасибо, но таким образом столбец индекса теряется, не так ли?