Группировка фрейма данных, подсчет вхождений в одном столбце, размещение значений других столбцов в наборах

#python #pandas #dataframe #pandas-groupby

Вопрос:

У меня есть фрейм данных, назовем его «данные», следующим образом:

 index  ID  name
0      23   aaa
1      42   bbb
2      23   aab
3      42   bbb
4      42   bbb
... 
 

Я хочу подсчитать количество встречающихся идентификаторов и создать дополнительный столбец для этого, по которому я могу сортировать. Кроме того, я хочу добавить имена в наборы, потому что они могут отличаться. Что-то вроде этого (дополнительный индекс необязательно):

 count ID  name
3     42  {bbb}
2     23  {aaa, aab}
 

Я знаю, что решение находится где-то в функции group_by (). Я могу поместить имена в наборы с data.groupby('ID')['name'].apply(set).reset_index() помощью, но как дополнительно подсчитать вхождения идентификатора и правильно добавить числа во фрейм данных? Я стою на шланге, как говорит немец. Большое спасибо!

Ответ №1:

Вы можете использовать .agg с несколькими параметрами:

 x = df.groupby("ID", as_index=False).agg(
    count=("ID", "size"), name=("name", set)
)
print(x)
 

С принтами:

    ID  count        name
0  23      2  {aaa, aab}
1  42      3       {bbb}
 

Ответ №2:

Вы можете использовать groupBy.agg() следующее:

 df.groupby('ID').agg({'ID':'count',
                      'name':set}).rename(columns={'ID':'ID_count'}).reset_index()
 

С принтами:

    ID  ID_count        name
0  23         2  {aaa, aab}
1  42         3       {bbb}
 

Ответ №3:

Вы можете использовать это:

 df.groupby(['ID'])['name'].agg([set,'count']).rename(columns={'set':'name'}).reset_index()
 

Выход:

    ID        name  count
0  23  {aaa, aab}      2
1  42       {bbb}      3