2017-10-11 3 views
0

(I Pandas lerne, so bitte erklären Lösung)Pandas - Wie kommt man Liste der

Meine Daten sieht wie folgt aus:

Category currency sellerRating Duration endDay ClosePrice 

0 Music/Movie/Game US 3249 5 Mon  0.01 0.01  
1 Music/Movie/Game US 3249 5 Mon  0.01 0.01  
2 Music/Movie/Game US 3249 5 Mon  0.01 0.01  
3 Music/Movie/Game US 3249 5 Mon  0.01 0.01  
4 Music/Movie/Game US 3249 5 Mon  0.01 0.01  

Dtypes Ergebnis ist:

Category   object 
currency   object 
sellerRating  int64 
Duration   int64 
endDay   object 
ClosePrice  float64 
OpenPrice  float64 
PriceIncrease float64 
dtype: object 

I Ich versuche die Top (zB Top 10) Items mit dem höchsten ClosePrice für jede Kategorie zu finden.

Aus Ideen, Aufgeben und versuchen, für jede Kategorie es von Hand zu tun, ich habe versucht:

df[(df['ClosePrice']> 93) & ([df.Category == 'Automotive'])] 

... aber es hat nicht funktioniert. Der Fehler, den ich bekommen ist:

ValueError: operands could not be broadcast together with shapes (351550,) (1975,) 

Ich habe auch Crosstab erforscht, aber es ist nicht das, was ich suche.

Es muss eine Möglichkeit geben, was ich will automatisch in einer Zeile Pandas-Code zu tun. Irgendein Rat? Vielen Dank!

Antwort

0

verwende ich nlargest Methode verwenden würde:

df.groupby('Category', group_keys=False).apply(lambda x: x.nlargest(10, 'ClosePrice')) 
0

Verwenden groupby und wenden Sie dann die Sortierung nur Top-k

top = 10 
df.groupby('Category', group_keys=None).apply(lambda x: x.sort_values('ClosePrice')[:top]) 

Werte halten Da Sie für eine Erklärung der Lösung fragen, ich werde es versuchen.

Mithilfe von groupby erstellen Sie Gruppen von Daten basierend auf der Kategorie-Spalte. Jede Gruppe wird dieselbe Kategorie haben. Danach gilt der Code. Für jede Gruppe sortiert sort_values die Daten nach ClosePrice und erhält danach nur die oberen Werte.

Der obige Code kann die Indizes "verwirren", indem der ursprüngliche Index beibehalten wird. Wenn Sie den Index zurücksetzen müssen, müssen Sie

df.groupby('Category', group_keys=None).apply(lambda x: x.sort_values('ClosePrice')[:top]).reset_index(drop=True)

+0

sort_values ​​Sorten in aufsteigender Reihenfolge, im Wesentlichen Sie die untere n-Werte zu geben. Bitte beachten Sie auch, dass Ihre Antwort sehr ähnlich zu meiner ist. –

+0

Danke für die Antwort Arthur! – skeitel

Verwandte Themen