2014-12-10 12 views
34

dataframe:Come eseguire il loop su un dataframe Panda raggruppato?

c_os_family_ss c_os_major_is l_customer_id_i 
0  Windows 7       90418 
1  Windows 7       90418 
2  Windows 7       90418 

Codice:

print df 
for name, group in df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)): 
    print name 
    print group 

Sto cercando di appena un ciclo su dati aggregati, ma ottengo l'errore:

ValueError: too many values to unpack

@EdChum, ecco la uscita prevista:

            c_os_family_ss \ 
l_customer_id_i 
131572   Windows 7,Windows 7,Windows 7,Windows 7,Window... 
135467   Windows 7,Windows 7,Windows 7,Windows 7,Window... 

                c_os_major_is 
l_customer_id_i 
131572   ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,... 
135467   ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,... 

L'output non è un problema, desidero eseguire il loop su ogni gruppo.

+0

Hai solo una singola colonna da decomprimere che risulterà in "c_os_family_ss'", quale è l'output previsto, che cosa stai cercando di ottenere? – EdChum

+0

@EdChum Ci sono altri campi, ho appena copiato gli ultimi. Sto provando a raggrupparlo per cliente e group_concat i campi. – Tjorriemorrie

+0

@EdChum aggiornato – Tjorriemorrie

risposta

59

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) restituisce già un dataframe, quindi non è più possibile eseguire il loop sui gruppi.

In generale:

  • df.groupby(...) restituisce un oggetto GroupBy (un DataFrameGroupBy o SeriesGroupBy), e con questo, è possibile scorrere i gruppi (come spiegato nella documentazione here). Si può fare qualcosa di simile:

    grouped = df.groupby('A') 
    
    for name, group in grouped: 
        ... 
    
  • Quando si applica una funzione sul GroupBy, nel tuo esempio df.groupby(...).agg(...) (ma questo può anche essere transform, apply, mean, ...), si combinano il risultato di che applica la funzione ai diversi gruppi insieme in un dataframe (la fase apply e combine del paradigma 'split-apply-combine' di groupby). Quindi il risultato sarà sempre un DataFrame (o una serie in base alla funzione applicata).

4

È possibile scorrere i valori dell'indice se il dataframe è già stato creato.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) 
for name in df.index: 
    print name 
    print df.loc[name] 
Problemi correlati