2015-09-08 69 views
8

Ho un dataframe che è stato creato tramite un df.pivot:Python Pandas dataframe selezionare fila valore massimo nel gruppo

type        start end 
F_Type   to_date      
A    20150908143000 345 316 
B    20150908140300 NaN 480 
       20150908140600 NaN 120 
       20150908143000 10743 8803 
C    20150908140100 NaN 1715 
       20150908140200 NaN 1062 
       20150908141000 NaN 145 
       20150908141500 418 NaN 
       20150908141800 NaN 450 
       20150908142900 1973 1499 
       20150908143000 19522 16659 
D    20150908143000 433  65 
E    20150908143000 7290 7375 
F    20150908143000  0  0 
G    20150908143000 1796 340 

Vorrei filtrare e restituire una singola riga per ogni 'F_TYPE' solo il ritorno la riga con il massimo 'to_date'. Vorrei restituire il seguente dataframe:

type        start end 
F_Type   to_date      
A    20150908143000 345 316 
B    20150908143000 10743 8803 
C    20150908143000 19522 16659 
D    20150908143000 433  65 
E    20150908143000 7290 7375 
F    20150908143000  0  0 
G    20150908143000 1796 340 

Thanks ..

+0

'F_Type' è una colonna o il tuo indice? Penso che 'df.groupby ('F_Type'). Max()' dovrebbe funzionare o 'df.groupby (df.index) .max()', in effetti penso che 'df.max (level = 0)' dovrebbe funzionare – EdChum

risposta

20

Un approccio standard è quello di utilizzare groupby(keys)[column].idxmax(). Tuttavia, per selezionare le righe desiderate utilizzando idxmax è necessario idxmax restituire valori di indice univoci. Un modo per ottenere un indice univoco è chiamare reset_index.

Dopo aver ottenuto i valori di indice da groupby(keys)[column].idxmax() è possibile selezionare l'intera riga con df.loc:

In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()] 
Out[20]: 
         start end 
F_Type to_date      
A  20150908143000 345 316 
B  20150908143000 10743 8803 
C  20150908143000 19522 16659 
D  20150908143000 433  65 
E  20150908143000 7290 7375 
F  20150908143000  0  0 
G  20150908143000 1796 340 

Nota: idxmax rendimenti dell'indice etichette, non necessariamente ordinali. Dopo aver utilizzato reset_index le etichette indice capita di essere anche ordinali, ma dal momento che idxmax sta tornando etichette (non ordinali) è meglio sempre uso idxmax in combinazione con df.loc, non df.iloc (come ho inizialmente fatto in questo post.)

+0

Eccellente, questa è una soluzione molto elegante che funziona perfettamente. Grazie per la tua guida. – user636322

Problemi correlati