2015-05-27 7 views
8

Fondamentalmente uguale a Select first row in each GROUP BY group? solo in panda.panda: come selezionare la prima riga in ogni gruppo GROUP BY?

df = pd.DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar'], 
       'B' : ['3', '1', '2', '4','2', '4', '1', '3'], 
        }) 

Ordinamento sembra essere molto promettente:

df.sort('B') 

    A B 
1 foo 1 
6 bar 1 
2 foo 2 
4 bar 2 
0 foo 3 
7 bar 3 
3 foo 4 
5 bar 4 

Ma poi la prima non darà il risultato desiderato ... df.groupby ('A') prima()

 B 
A  
bar 2 
foo 3 

risposta

4

vorrei offrire più un'alternativa:

df[ df.groupby('A')['B'].rank() == 1 ] 

    A B 
1 foo 1 
6 bar 1 

Un possibile vantaggio è che si restituisce un dataframe indicizzato come, per i casi in cui che ci si vuole questo.

Inoltre, non intendo questo come una domanda o una critica alla risposta di @ EdChum, ma non è ovvio per me che l'ordinamento è preservato quando si passa al groupby. Forse è in accordo con le API pandas, ma onestamente non so se è qualcosa che può essere contato qui o no, mentre il metodo rank() non è ambiguo come quello.

+1

d'accordo, mi stavo chiedendo lo stesso me stesso. – ihadanny

+0

Il problema è che '' df.sort ('B') '' restituisce una copia * ordinata * di df, non cambia df stesso. Se vuoi cambiare df, devi fare una delle seguenti azioni: '' df = df.sort_values ​​('B') '' o '' df.sort_values ​​(inplace = True) ''. (i panda ora usano '' sort_values'' invece di '' sort''.) – prooffreader

5
.

Generalmente se vuoi che i tuoi dati siano ordinati in un gruppo, ma non è una delle colonne su cui si andrà a raggruppare, allora è meglio fare sort prima di eseguire groupby:

In [5]: 
df.sort('B').groupby('A').first() 

Out[5]: 
    B 
A  
bar 1 
foo 1 
+0

È possibile contare su un gruppo per conservare l'ordinamento? Onestamente non lo so, sto solo chiedendo. Non mi sembra che lo sarebbe, anche se potrebbe benissimo essere il caso. – JohnE

+0

@JohnE si dovrebbe, altrimenti dovresti ricorrere di nuovo che sarebbe un dolore – EdChum

+0

hey, sto preferendo il metodo di @ JohnE in quanto è più pulito e più simile a SQL. Forse nei panda puoi contare sull'ordinamento per essere stabile dopo il raggruppamento da un'altra colonna (timsort?) Ma non è così ovvio come la sintassi 'rank' – ihadanny

4

La funzione pandas groupby potrebbero essere utilizzati per ciò che si vuole, ma è davvero significava per l'aggregazione. Questa è una semplice operazione "prendi la prima".

Quello che in realtà si desidera è la funzione pandas drop_duplicates, che per impostazione predefinita restituirà la prima riga. Quello che di solito considereresti la chiave di gruppo, dovresti passare come sottoinsieme = variabile

Dovrebbe fare quello che vuoi.

Inoltre, df.sort('A') non ordina DataFrame df, restituisce una copia che è ordinata. Se si desidera ordinarlo, è necessario aggiungere il parametro inplace=True.

df.sort('A', inplace=True) 
+0

Grazie a @firelynx, ma quello che stavo veramente cercando è' df.sort (' B '). Groupby (' A '). Primo() ' – ihadanny