2013-10-22 23 views
24

1). Ho un insieme di dati seguente esempio:Ridenominazione dei nomi delle colonne in Pandas Funzione Groupby

>>> df 
    ID  Region count 
0 100  Asia  2 
1 101  Europe  3 
2 102   US  1 
3 103  Africa  5 
4 100  Russia  5 
5 101 Australia  7 
6 102   US  8 
7 104  Asia  10 
8 105  Europe  11 
9 110  Africa  23 

ho voluto raggruppare le osservazioni di questo set di dati per ID di una Regione e sommando il conteggio per ogni gruppo. Così ho usato qualcosa di simile:

>>> print(df.groupby(['ID','Region'],as_index=False).count.sum()) 

    ID  Region count 
0 100  Asia  2 
1 100  Russia  5 
2 101 Australia  7 
3 101  Europe  3 
4 102   US  9 
5 103  Africa  5 
6 104  Asia  10 
7 105  Europe  11 
8 110  Africa  23 

On utilizzando as_index = False sono in grado di ottenere un output "SQL-like". Il mio problema è che non riesco a rinominare il conteggio delle variabili aggregate qui. Quindi, in Sql, se voleva fare la cosa di cui sopra vorrei fare qualcosa di simile:

select ID, Region, sum(count) as Total_Numbers 
from df 
group by ID,Region 
order by ID, Region 

Come si vede, è molto facile per me di rinominare la variabile 'conteggio' aggregato Total_Numbers in SQL. Volevo fare la stessa cosa in Pandas ma non trovo questa opzione nella funzione groupby. Qualcuno può aiutare?

2). La seconda domanda e più di un'osservazione è che è possibile utilizzare direttamente i nomi delle colonne nella funzione dataframe di Pandas senza racchiuderli tra virgolette? Capisco che i nomi delle variabili siano string, quindi devono essere tra virgolette, ma vedo se uso all'esterno della funzione dataframe e come attributo non richiediamo che siano tra virgolette. Come df.ID.sum() ecc. È solo quando lo usiamo in una funzione DataFrame come df.sort() o df.groupby dobbiamo usarlo all'interno di virgolette. Questo è in realtà un po 'di dolore come in SQL o in SAS o in altri linguaggi semplicemente usiamo il nome della variabile senza citarli. Qualche suggerimento su questo?

Si prega di suggerire i due punti precedenti (1 ° principale, 2 ° più di un parere).

Grazie

risposta

28

Per la prima domanda penso risposta sarebbe:

<your DataFrame>.rename(columns={'count':'Total_Numbers'}) 

o

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers'] 

Per quanto riguarda la seconda Direi che la risposta sarebbe no. E 'possibile utilizzarlo come 'df.ID' a causa della python datamodel:

attributi riferimenti sono tradotti in controlli in questo dizionario, esempio, m.x è equivalente a m. dict [ "x"]

+0

Thxs per la risposta. La cosa del rinominato ha aiutato, tranne che suppongo che nella prima sintassi dobbiamo anche menzionare le colonne = .. quindi, .rename (columns = {'count': 'Total_Numbers') }). Altrimenti ci vorrebbe per l'indice e non cambia il nome della colonna. La seconda cosa funziona perfettamente, ma se una o due variabili devono essere rinominate, suppongo che la prima sia più comoda piuttosto che menzionare tutti i nomi delle variabili nella seconda sintassi. Speravo che ci fosse qualcosa in groupby ma sembra che non ci sia. Inoltre, capisco che i panda siano un dotto intrinseco. Speravo in una certa flessibilità in Panda – Baktaawar

14

L'attuale (a partire dalla versione 0.20) metodo per modificare i nomi delle colonne dopo un'operazione groupby è quello di catena il metodo rename. Vedere this deprecation note nella documentazione per maggiori dettagli.

risposta deprecati come di panda versione 0.20

Questo è il primo risultato di Google e, anche se la risposta superiore funziona in realtà non rispondere alla domanda. C'è un better answer here e un lungo discussion on github sulle funzionalità complete dei dizionari di passaggio al metodo agg.

Queste risposte purtroppo non esistono nella documentazione, ma il formato generale per raggruppare, aggregare e rinominare le colonne utilizza un dizionario di dizionari. Le chiavi del dizionario esterno sono nomi di colonna che devono essere aggregati.I dizionari interni hanno chiavi che la nuova colonna assegna ai valori la funzione di aggregazione.

Prima di arrivare, creiamo un DataFrame a quattro colonne.

df = pd.DataFrame({'A' : list('wwwwxxxx'), 
        'B':list('yyzzyyzz'), 
        'C':np.random.rand(8), 
        'D':np.random.rand(8)}) 

    A B   C   D 
0 w y 0.643784 0.828486 
1 w y 0.308682 0.994078 
2 w z 0.518000 0.725663 
3 w z 0.486656 0.259547 
4 x y 0.089913 0.238452 
5 x y 0.688177 0.753107 
6 x z 0.955035 0.462677 
7 x z 0.892066 0.368850 

Diciamo che vogliamo gruppo da colonne A, B e colonna aggregata C con mean e median e aggregati colonna D con max. Il seguente codice lo farebbe.

df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'}) 

      D   C   
      max  mean median 
A B        
w y 0.994078 0.476233 0.476233 
    z 0.725663 0.502328 0.502328 
x y 0.753107 0.389045 0.389045 
    z 0.462677 0.923551 0.923551 

Questo restituisce un DataFrame con un indice gerarchico. La domanda originale chiedeva di rinominare le colonne nello stesso passo. Ciò è possibile usando un dizionario di dizionari:

df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'}, 
          'D':{'D_max': 'max'}}) 

      D   C   
     D_max C_mean C_median 
A B        
w y 0.994078 0.476233 0.476233 
    z 0.725663 0.502328 0.502328 
x y 0.753107 0.389045 0.389045 
    z 0.462677 0.923551 0.923551 

Ciò rinomina le colonne tutto in una volta, ma lascia ancora l'indice gerarchico che il livello superiore può essere eliminato con df.columns = df.columns.droplevel(0).