2014-04-30 18 views
25

Sto utilizzando groupby su un dataframe panda per eliminare tutte le righe che non hanno il minimo di una colonna specifica. Qualcosa del genere:Mantiene altre colonne quando si utilizza min() con groupby

df1 = df.groupby("item", as_index=False)["diff"].min() 

Tuttavia, se ho più di quelle due colonne, le altre colonne vengono rilasciate. Posso mantenere quelle colonne usando groupby, o dovrò trovare un modo diverso di eliminare le righe?

miei dati assomiglia:

item diff otherstuff 
    0 1  2   1 
    1 1  1   2 
    2 1  3   7 
    3 2  -1   0 
    4 2  1   3 
    5 2  4   9 
    6 2  -6   2 
    7 3  0   0 
    8 3  2   9 

e dovrebbe finire come:

item diff otherstuff 
    0 1  1   2 
    1 2  -6   2 
    2 3  0   0 

ma quello che sto ricevendo è:

item diff 
    0 1  1   
    1 2  -6   
    2 3  0   

ho cercato attraverso la documentazione e non riesce a trovare nulla. Ho provato:

df1 = df.groupby(["item", "otherstuff"], as_index=false)["diff"].min() 

df1 = df.groupby("item", as_index=false)["diff"].min()["otherstuff"] 

df1 = df.groupby("item", as_index=false)["otherstuff", "diff"].min() 

Ma nessuno di questi lavori (realizzato con l'ultimo che la sintassi è destinata all'aggregazione dopo la creazione di un gruppo).

risposta

50

Metodo # 1: utilizzare idxmin() per ottenere i indici degli elementi di minimo diff, e di scegliere quali:

>>> df.loc[df.groupby("item")["diff"].idxmin()] 
    item diff otherstuff 
1  1  1   2 
6  2 -6   2 
7  3  0   0 

[3 rows x 3 columns] 

Metodo # 2: ordina per diff, e poi prendere il primo elemento ciascun gruppo item:

>>> df.sort("diff").groupby("item", as_index=False).first() 
    item diff otherstuff 
0  1  1   2 
1  2 -6   2 
2  3  0   0 

[3 rows x 3 columns] 

noti che gli indici risultanti sono differenti anche se il contenuto riga è la stessa.

+0

Il primo restituisce tutto 'NaN', ma il secondo metodo funziona. Grazie! – PointXIV

+0

Grazie per aver fornito due modi per farlo. Ho trovato più istanze che uno funziona quando l'altro non lo fa e viceversa. Sembra che dipenda se i tuoi elementi sono numerici o meno. Buono ad averli entrambi – sfortney

+1

.sort_values ​​invece al giorno d'oggi ... giusto? –

Problemi correlati