2014-04-30 9 views
25

Używam groupby na pandas Dataframe, aby usunąć wszystkie wiersze, które nie mają minimum określonej kolumny. Coś takiego:Przechowywać inne kolumny przy użyciu min() z groupby

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

Jednakże, jeśli mam więcej niż dwie kolumny, pozostałe kolumny są pomijane. Czy mogę zachować te kolumny przy użyciu groupby, czy też będę musiała znaleźć inny sposób na opuszczenie wierszy?

Moje dane wygląda następująco:

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 

i powinien skończyć jak:

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

ale co dostaję to:

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

Szukałem przez dokumentacji i nie można znaleźć niczego. Próbowałem:

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() 

Ale żadna z tych prac (realizowana z ostatnią, której składnia ma służyć agregowaniu po utworzeniu grupy).

Odpowiedz

50

Sposób nr 1: użyj idxmin() dostać indeksów z elementów minimalnej diff, a następnie wybrać te:

>>> 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] 

Sposób nr 2: Sortuj według diff, a następnie pierwszy element każdy item grupy:

>>> 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] 

Należy zauważyć, że wynikowe wskaźniki są różne, chociaż zawartość rzędzie są takie same.

+0

Pierwsza zwraca wszystkie 'NaN', ale druga metoda działa. Dziękuję Ci! – PointXIV

+0

Dziękujemy za udostępnienie dwóch sposobów. Znalazłem wiele instancji, które działają, gdy drugi nie działa i odwrotnie. Wydaje się, że zależy to od tego, czy twoje elementy są liczbowe, czy nie. Dobrze mieć oba. – sfortney

+1

.sort_values ​​zamiast obecnie ... prawda? –

Powiązane problemy