Quiero fusionar varias cadenas en un marco de datos basado en un grupo 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í:
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!
python-3.x
pandas
pandas-groupby
Mattiasostmar
fuente
fuente
pandas < 1.0
,.drop_duplicates()
ignora el índice, que puede dar resultados inesperados. Puede evitar esto usando en.agg(lambda x: ','.join(x))
lugar de.transform().drop_duplicates()
.drop_duplicates()
podría no funcionar si no incluye el parámetrodrop_duplicates(inplace=True)
o simplemente reescribe la línea de código comodf = df[['name','text','month']].drop_duplicates()
podemos agrupar por las columnas 'nombre' y 'mes', luego llamar a las funciones agg () de los objetos DataFrame de Panda.
La funcionalidad de agregación proporcionada por la función agg () permite calcular múltiples estadísticas por grupo en un cálculo.
df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})
fuente
La respuesta de EdChum le brinda 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)
fuente
Para mí, las soluciones anteriores estaban cerca, pero agregaron algunos / n y dtype: object no deseados, 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()
fuente