2015-07-22 41 views
21

dato un dataframe che registra l'uso di alcuni libri come questo:Come groupby un dataframe in Pandas e mantenere Colonne

Name Type ID 
Book1 ebook 1 
Book2 paper 2 
Book3 paper 3 
Book1 ebook 1 
Book2 paper 2 

ho bisogno di ottenere il conteggio di tutti i libri, mantenendo le altre colonne e ottenere questo :

Name Type ID Count 
Book1 ebook 1  2 
Book2 paper 2  2 
Book3 paper 3  1 

Come si può fare?

Grazie!

+1

Quando dici "ottieni il conto di tutti i libri", cosa stai dicendo esattamente. Vuoi il conteggio per Nome, Tipo, ID o una combinazione di questi? Come sarebbero i risultati se Book1 avesse anche un tipo di 'carta'? – Alexander

+0

Voglio contare tutti i libri per nome e Nome e tipo sono sempre coerenti: Libro1 sarà sempre un ebook. –

risposta

20

si desidera che il seguente:

In [20]: 
df.groupby(['Name','Type','ID']).count().reset_index() 

Out[20]: 
    Name Type ID Count 
0 Book1 ebook 1  2 
1 Book2 paper 2  2 
2 Book3 paper 3  1 

Nel tuo caso il 'Nome', 'Tipo' e 'ID' colli partita di valori in modo che possiamo groupby su questi, chiamare count e poi reset_index.

Un approccio alternativo potrebbe essere quella di aggiungere la colonna 'Conte' utilizzando transform e quindi chiamare drop_duplicates:

In [25]: 
df['Count'] = df.groupby(['Name'])['ID'].transform('count') 
df.drop_duplicates() 

Out[25]: 
    Name Type ID Count 
0 Book1 ebook 1  2 
1 Book2 paper 2  2 
2 Book3 paper 3  1 
+0

Questo mi restituisce un dataframe vuoto – Geeocode

+1

Questo sembra funzionare, ma se avessimo molte più colonne (come ho in altri dataframes), questa prestazione non sarebbe male? Inoltre, non è molto intuitivo. –

+0

Il problema qui è che il raggruppamento ridurrà la quantità di informazioni in modo da non produrre necessariamente il df desiderato in una volta sola, ho aggiornato la mia risposta per mostrare come potrebbe essere fatto in 2 passaggi che è meglio capire – EdChum

10

Penso as_index = False dovrebbe fare il trucco.

df.groupby(['Name','Type','ID'], as_index=False).count() 
Problemi correlati