Объединить строки с пандами GroupBy на основе заказа из другого столбца - PullRequest
1 голос
/ 23 июня 2019

Мой фрейм данных имеет следующие данные

callerid  seq   text
1236     2      I need to talk to x
1236     6      Issue 3 is this
1236     3      This is regarding abc
1236     5      Issue 2 is this
1236     4      Issue 1 is this
1236     1      Hi
1347     2      I need to talk to x
1347     6      Issue 3 is this
1347     3      This is regarding abc
1347     5      Issue 2 is this
1347     4      Issue 1 is this
1347     1      Hi

Мне нужно сгруппировать данные по callerid, отсортировать по seq, concat text и записать в другой фрейм данных

Окончательные выходные данные должны выглядеть следующим образом

callerid        text    
1236            Hi I need to talk to X This is regarding abc Issue 1 is this Issue 2 is this Issue 3 is this    
1347            Hi I need to talk to X This is regarding abc Issue 1 is this Issue 2 is this Issue 3 is this

Я попробовал следующий код

documentext = dataextract.sort_values(['callerid','seq']).groupby('callerid')

documenttext1 = documenttext[['callerid','text']]
documentext1 = (documenttext1.groupby('callerid')['text']
       .apply(lambda x: ' '.join(set(x.dropna())))
       .reset_index())

Первое утверждение не дает мне полный отсортированный текст Это вывод, который я получаю

callerid seq   text
1236     1     Hi
1236     2     I need to talk to x
1236     3     This is regarding abc
1347     1     Hi
1347     2     I need to talk to x
1347     3     This is regarding abc

Ценю любую помощь по этому вопросу

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Как вы уже догадались, первый шаг - сортировка, второй - группировка. Вы можете использовать ' '.join в качестве aggfunc для объединения ваших строк.

(df.sort_values('seq')
   .groupby('callerid', sort=False)['text']
   .agg(' '.join)
   .reset_index())

   callerid                                               text
0      1236  Hi I need to talk to x This is regarding abc I...
1      1347  Hi I need to talk to x This is regarding abc I...

Вы не должны группировать по "seq", так как вы пытаетесь агрегировать по it.

1 голос
/ 23 июня 2019

Больше похоже на индекс sum

(' '+df.set_index(['callerid','seq']).\
   sort_index([0,1]).text).\
      sum(level=0,axis=0).str.strip().reset_index()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...