2014-12-04 17 views
12

Voglio unire più stringhe in un dataframe in base a un gruppo in Pandas.Concatena stringhe da più righe utilizzando il gruppo Pandasby

Questo è il mio codice finora:

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) 

Voglio che il risultato finale a guardare come questo:

enter image description here

Non capisco come posso usare groupby e applicare un po ' una sorta di concatenazione delle stringhe nella colonna "testo". Qualsiasi aiuto apprezzato!

risposta

18

È possibile GroupBy i 'name' e 'month' colonne, quindi chiamare transform che restituirà i dati allineati al df originale e applicare una lambda dove abbiamo join le voci di testo:

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 

I sub del df originale passando un elenco delle colonne di interesse df[['name','text','month']] qui e poi chiamare drop_duplicates

EDIT in realtà posso solo chiamare apply e poi 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 

aggiornamento

il lambda è inutile qui:

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 
2

La risposta da EdChum si dà un sacco di flessibilità, ma se si desidera solo per concateate stringhe in un colonna di oggetti elenco è inoltre possibile:

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

+0

Nota, questo funziona solo con una colonna alla volta. – ybull

Problemi correlati