Вы можете группировать столбцы 'name'
и 'month'
, а затем вызывать transform
, которые возвращают данные, выровненные по исходному df, и применяют лямбда, где мы join
текстовые записи:
In [119]:
df['text'] = df[['name','text','month']].groupby(['name','month'])['text'].transform(lambda x: ','.join(x))
df[['name','text','month']].drop_duplicates()
Out[119]:
name text month
0 name1 hej,du 11
2 name1 aj,oj 12
4 name2 fin,katt 11
6 name2 mycket,lite 12
Я подставляю оригинальный df, передавая здесь список интересующих столбцов df[['name','text','month']]
, а затем вызываю drop_duplicates
EDIT, на самом деле я могу просто вызвать apply
, а затем reset_index
:
In [124]:
df.groupby(['name','month'])['text'].apply(lambda x: ','.join(x)).reset_index()
Out[124]:
name month text
0 name1 11 hej,du
1 name1 12 aj,oj
2 name2 11 fin,katt
3 name2 12 mycket,lite
update
здесь не требуется lambda
:
In[38]:
df.groupby(['name','month'])['text'].apply(','.join).reset_index()
Out[38]:
name month text
0 name1 11 du
1 name1 12 aj,oj
2 name2 11 fin,katt
3 name2 12 mycket,lite
Для меня вышеупомянутые решения были близки, но добавили некоторые нежелательные / n и dtype: object, так что вот модифицированная версия:
df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
Ответ EdChum дает вам большую гибкость, но если вы просто хотите учесть строки в столбце объектов списка, вы также можете:
output_series = df.groupby(['name','month'])['text'].apply(list)