2017-02-28 6 views
2

Ich frage mich, wie die Zeilen mit n kleinsten Werten in einem Datenrahmen df zurückgegeben werden, der so aussieht.geben Sie die n größten/kleinsten Werte in Pandas Datenframe zurück, wo viele Zeilen die gleichen Werte enthalten

id   xx    count 
1   A    1 
2   B    1 
3   C    3 
4   D    2 
5   E    3 
6   F    10 
7   G    11 
8   H    17 

sagen, dass ich die Zeilen mit den drei kleinsten Zählungen finden wollen (in diesem Fall sind die drei kleinsten zählt 1,2 und 3). Also, ich mag die Antwort so sein:

id   xx    count 
    1   A    1 
    2   B    1 
    4   D    2 
    3   C    3 
    5   E    3 

Wenn ich einfach den Datenrahmen sortieren basierend auf Zahl und verwende df.nsmallest(3, 'count'), wäre es nur gibt die ersten drei Reihen des gewünschten Datenrahmen. Aber ich möchte alle Zeilen, die die 3 kleinsten Zählungen enthalten. Gibt es einen einfacheren Weg, dies in Pandas zu tun? Danke im Voraus!

Antwort

3

Sie können erste drop_duplicates mit nsmallest für Werte zu finden und dann boolean indexing mit isin:

s = df['count'].drop_duplicates().nsmallest(3) 
print (s) 
0 1 
3 2 
2 3 
Name: count, dtype: int64 

print (df[df['count'].isin(s)]) 
    id xx count 
0 1 A  1 
1 2 B  1 
2 3 C  3 
3 4 D  2 
4 5 E  3 

Eine andere Lösung mit unique, durch numpy.sort Sortierung (weil Ausgabe von unique in numpy array) und Auswählen ersten 3 Werte:

arr = np.sort(df['count'].unique())[:3] 
print (arr) 
[1 2 3] 

print (df[df['count'].isin(arr)]) 
    id xx count 
0 1 A  1 
1 2 B  1 
2 3 C  3 
3 4 D  2 
4 5 E  3 
+0

Sie sind wirklich erstaunlich @jezrael !! – Gingerbread

1

Eine andere Lösung - mit rank() Methode:

In [43]: df[df['count'].rank(method='dense') <= 3] 
Out[43]: 
    id xx count 
0 1 A  1 
1 2 B  1 
2 3 C  3 
3 4 D  2 
4 5 E  3 
Verwandte Themen