2013-11-21 1 views
9

Supponiamo di partire da questa semplice tabella, memorizzata in un dataframe panda:Esiste un'operazione "separa per" opposta a .groupby in panda?

name age family 
0 john 1  1 
1 jason 36  1 
2 jane 32  1 
3 jack 26  2 
4 james 30  2 

poi faccio

group_df = df.groupby('family') 
group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean}) 

dove name_join è una semplice funzione di aggregazione per i nomi:

def name_join(list_names, concat='-'): 
    return concat.join(list_names) 

l'uscita è:

 age    name 
family      
1  23 john-jason-jane 
2  28  jack-james 

Ora la domanda.

Esiste un modo rapido ed efficiente per ottenere quanto segue dalla tabella aggregata?

name age family 
0 john 23  1 
1 jason 23  1 
2 jane 23  1 
3 jack 28  2 
4 james 28  2 

(Nota: i numeri sono solo esempi, non mi interessa per le informazioni che mi sto perdendo dopo una media in questo esempio specifico)

Il modo in cui ho pensato che avrei potuto farlo non sembra troppo efficiente :

  1. creare dataframe vuoto
  2. da ogni linea group_df, separare i nomi
  3. cambio una dataframe con un numero di righe come ci sono nomi nel riga iniziale
  4. aggiungerà l'output al dataframe vuoto
+0

possibile duplicato di [panda: come divido il testo in una colonna in più colonne?] (Http://stackoverflow.com/questions/17116814/pandas-how-do-i-split-text-in-a -colonna in più colonne) –

risposta

8

Esso non può essere utile pensare dell'operazione come "opposto" di GroupBy.

Stai dividendo una stringa in pezzi e mantenendo l'associazione di ogni pezzo con "famiglia". This old answer of mine fa il lavoro.

Basta impostare 'family' come prima colonna dell'indice, fare riferimento al link sopra, quindi reset_index() alla fine per ottenere il risultato desiderato.

+0

geniale! Sto ancora osservando quale sia la combinazione di apply, lambda, pd.Series e stack, ma funziona esattamente come previsto. Grazie! – mkln