Concatenar cadenas de varias filas usando Pandas groupby

Quiero fusionar varias cadenas en un dataframe basado en un agrupado en Pandas.

Este es mi código hasta ahora:

import pandas as pd from io import StringIO data = StringIO(""" "name1","hej","2014-11-01" "name1","du","2014-11-02" "name1","aj","2014-12-01" "name1","oj","2014-12-02" "name2","fin","2014-11-01" "name2","katt","2014-11-02" "name2","mycket","2014-12-01" "name2","lite","2014-12-01" """) # load string as stream into dataframe df = pd.read_csv(data,header=0, names=["name","text","date"],parse_dates=[2]) # add column with month df["month"] = df["date"].apply(lambda x: x.month) 

Quiero que el resultado final se vea así:

enter image description here

No entiendo cómo puedo usar groupby y aplicar algún tipo de concatenación de las cadenas en la columna “texto”. Cualquier ayuda apreciada!

Puede agrupar por las columnas 'name' y 'month' , luego llamar a la transform que devolverá datos alineados con la df original y aplicará una lambda donde join las entradas de texto:

 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 

Subo el df original pasando una lista de las columnas de interés df[['name','text','month']] aquí y luego llamo drop_duplicates

EDITAR en realidad solo puedo llamar a apply y luego 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 

actualizar

el lambda es innecesario aquí:

 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 

La respuesta de EdChum le proporciona mucha flexibilidad, pero si solo desea concatenar cadenas en una columna de objetos de lista, también puede:

output_series = df.groupby(['name','month'])['text'].apply(list)

Para mí, las soluciones anteriores estaban cerca, pero agregué algunos objetos no deseados / n y dtype: así que aquí hay una versión modificada:

 df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()