#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. Спасибо, но таким образом столбец индекса теряется, не так ли?