Группируйте и объединяйте в фрейме данных pandas

#python #pandas #dataframe

Вопрос:

У меня есть фрейм данных, который выглядит примерно так — с name,count бытием strings и id бытием int .

Имя считать ID
азбука 123 01122
азбука 123 55432
азбука 123 33432
азбука 123 34786
xyz 232 36126
xyz 232 67437

Используя панд — я пытаюсь добраться до чего-то вроде

Имя считать ID
азбука 123 01122,55432,33432,34786
xyz 232 36126,67437

Я думал, что сработает что — то вроде приведенного ниже, но, похоже, на самом деле это не входит в список.

df.groupby(['name','count'])['id'].apply(lambda x: ','.join(map(str, x))).reset_index()

Ответ №1:

использовать astype() groupby() agg() :

 out=df.astype({'id':'str'}).groupby(['name','count'],as_index=False)['id'].agg(','.join)
#df.groupby(['name','count'],as_index=False)['id'].agg(lambda x: ','.join(map(str, x)))
 

выход из:

     name    count   id
0   abc     123     1122,55432,33432,34786
1   xyz     232     36126,67437
 

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

1. Большое вам спасибо! Я на самом деле думаю, что мой исходный запрос тоже сработал, но я ошибался, не создавая новый df с ним в своем коде (буду признателен за обратную связь, если вы думаете, что это не так). Ваши работы великолепны! спасибо тебе!

2. @Тим, это тоже работает df.groupby(['name','count'])['id'].apply(lambda x: ','.join(map(str, x))).reset_index()

3. @Tim также использует lambda x: ','.join(map(str, x)) функцию agg bcz, даже если это анонимная функция, но она работает быстрее, чем astype({'id':'str'}) для одного столбца