#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
Это выполняет прямое объединение внутри групп, а затем удаляет полученную строку.