Объединение строк после группировки по имени и последующей сортировки по дате

#python #pandas #sorting #pandas-groupby #string-concatenation

Вопрос:

У меня есть эти данные в фрейме данных

 
data = [
           {'name' : 'a', 'date' : '2020-01-02', 'message' : 'there'},
           {'name' : 'b', 'date' : '2020-01-01', 'message' : 'Hello'},
           {'name' : 'a', 'date' : '2020-01-01', 'message' : 'Hi'},
           {'name' : 'b', 'date' : '2020-01-03', 'message' : 'everyone'},
           {'name' : 'c', 'date' : '2020-01-05', 'message' : 'Test'}
       ]
 

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

 [
   {'name' : 'a', 'message' : 'Hi there'},
   {'name' : 'b', 'message' : 'Hello everyone'},
   {'name' : 'c', 'message' : 'Test'}
]
 

Я уже смог сгруппировать по имени и отсортировать по дате (после преобразования строки в объект datetime), используя это

 df.groupby(['name']).apply(lambda x: x.sort_values(['date'])
 

но я не уверен, как бы вы объединили строки вместе, как только сгруппировали и отсортировали данные.

Ответ №1:

Попробуйте apply с join

 df.sort_values('date').groupby('name')['message'].apply(' '.join).reset_index()

  name         message
0    a        Hi there
1    b  Hello everyone
2    c            Test
 

Ответ №2:

Альтернативно, чтобы избежать apply вызова:

 >>> df.sort_values(['name', 'date'], inplace=True)
>>> df

  name        date   message
2    a  2020-01-01        Hi
0    a  2020-01-02     there
1    b  2020-01-01     Hello
3    b  2020-01-03  everyone
4    c  2020-01-05      Test

>>> df['message'] = df['message']   ' '
>>> df
 
  name        date    message
2    a  2020-01-01        Hi 
0    a  2020-01-02     there 
1    b  2020-01-01     Hello 
3    b  2020-01-03  everyone 
4    c  2020-01-05      Test 

>>> df.groupby('name')['message'].sum().str.strip()

name
a          Hi there
b    Hello everyone
c              Test
Name: message, dtype: object
 

Это выполняет прямое объединение внутри групп, а затем удаляет полученную строку.