2014-06-27 40 views
5

Ho un dataframe panda df. Lo raggruppo per 3 colonne e conto i risultati. Quando lo faccio, perdo alcune informazioni, in particolare la colonna name. Questa colonna è mappata 1: 1 con la colonna desk_id. C'è comunque da includere entrambi nel mio dataframe finale?missing column after pandas groupby

Ecco l'dataframe:

shift_id shift_start_time  shift_end_time  name     end_time  desk_id shift_hour 
0 37423064 2014-01-17 08:00:00 2014-01-17 12:00:00 Adam Scott 2014-01-17 10:16:41.040000 15557987   2 
1 37423064 2014-01-17 08:00:00 2014-01-17 12:00:00 Adam Scott 2014-01-17 10:16:41.096000 15557987   2 
2 37423064 2014-01-17 08:00:00 2014-01-17 12:00:00 Adam Scott 2014-01-17 10:52:17.402000 15557987   2 
3 37423064 2014-01-17 08:00:00 2014-01-17 12:00:00 Adam Scott 2014-01-17 11:06:59.083000 15557987   3 
4 37423064 2014-01-17 08:00:00 2014-01-17 12:00:00 Adam Scott 2014-01-17 08:27:57.998000 15557987   0 

Gruppo I in questo modo:

grouped = df.groupby(['desk_id', 'shift_id', 'shift_hour']).size() 
grouped = grouped.reset_index() 

Ed ecco il risultato, manca la colonna name.

desk_id shift_id shift_hour 0 
0 14468690 37729081   0 7 
1 14468690 37729081   1 3 
2 14468690 37729081   2 6 
3 14468690 37729081   3 5 
4 14468690 37729082   0 5 

Inoltre, per rinominare la colonna contare come "contare" anziché "0"?

risposta

5

è necessario includere 'name' in groupby dai gruppi:

In [43]: 

grouped = df.groupby(['desk_id', 'shift_id', 'shift_hour', 'name']).size() 
grouped = grouped.reset_index() 
grouped.columns=np.where(grouped.columns==0, 'count', grouped.columns) #replace the default 0 to 'count' 
print grouped 
    desk_id shift_id shift_hour  name count 
0 15557987 37423064   0 Adam Scott  1 
1 15557987 37423064   2 Adam Scott  3 
2 15557987 37423064   3 Adam Scott  1 

Se il rapporto nome-id è una relazione molti-a-uno di tipo, diciamo che abbiamo un Pete Scott per lo stesso insieme di dati , il risultato sarà:

desk_id shift_id shift_hour  name count 
0 15557987 37423064   0 Adam Scott  1 
1 15557987 37423064   0 Pete Scott  1 
2 15557987 37423064   2 Adam Scott  3 
3 15557987 37423064   2 Pete Scott  3 
4 15557987 37423064   3 Adam Scott  1 
5 15557987 37423064   3 Pete Scott  1 
+0

non si raggruppa ancora con questo termine? Se non fosse una mappatura 1: 1 tra 'name' e' desk_id' questo mi darebbe ancora quello che voglio? – user3439329

+0

Vedi modifica. Il risultato avrà anche gli altri nomi, dello stesso desk_id o shift_id. –

+3

Quindi, se volessi includere 'shift_start_time' anche nel risultato finale. Aggiungendo a questo l'elenco di groupby va bene? anche se non voglio davvero raggrupparmi per questa colonna? – user3439329