2016-04-02 4 views
4

Ich habe einen Pandas Datenrahmen mit vielen Spalten, zwei von ihnen sind "Filmtitel" und "Alter", ich möchte die Top 5 Filme mit dem niedrigsten Altersdurchschnitt finden die Leute, die sie bewertet haben, aber nur Filme, die mindestens 100 Bewertungen haben (also in mindestens 100 Reihen erscheinen).Anzahl der doppelten Werte und Reihenfolge in einem Pandas Datenrahmen finden

Zum Beispiel:

movie title  age 

Title 1   10 
Title 2   12 
Title 2   12 
Title 3   13 
Title 3   13 
Title 3   13 

Sollte sich:

movie title  # of ratings  avg age 

Title 1   1     10 
Title 2   2     12 
Title 3   3     13 

Es kann in den gleichen oder einen neuen Datenrahmen sein. Danke für Ihre Hilfe!

Antwort

3

Der Filter erzeugt ein Flag für jeden Film, der auf True gesetzt, wenn der Filmtitel Zählung mehr als hundert und Falsch sonst.

n = 100 
filter = (df.groupby(['movie title'])['age'] 
      .transform(lambda group: group.count()) >= n) 

die kleine Größe Ihrer Beispieldaten gegeben, werde ich n Set 2 zu sein und meine Filter zu erstellen.

Jetzt filtere ich nur Filme mit einer Zählung von mehr als n, berechnen Sie das Durchschnittsalter pro Gruppe, und nehmen Sie dann die fünf kleinsten (d. H. Geringstes Alter).

>>> df[filter.values].groupby('movie title').age.mean().nsmallest(5) 
movie title 
Title 2 12 
Title 3 13 
Name: age, dtype: int64 
+0

könnten Sie nicht die "Filter" -Methode nach groupby direkt verwenden? –

+0

Dies scheint nicht Filme mit weniger als 100 Bewertungen herauszufiltern, wenn ich es laufe? – user2453297

+0

Es funktioniert, wenn der Datenrahmen nur die Spalten Filmtitel und Alter hat. Siehe Bearbeiten oben für die Fehlerbehebung. – Alexander

4

Sagen Sie bitte

agg = df.age.groupby([df['movie title']]).agg({'ave_age': 'mean', 'size': 'size'}) 

tun Sie werden eine Datenrahmen mit Spalten ave_age und size bekommen.

agg[agg['size'] > 100] 

gibt Ihnen nur diejenigen, die mehr als 100 Benutzer haben. Von dort aus, sortiert nach agg.ave_age und nehmen oben 5. Es sollte wie folgt aussehen:

agg[agg['size'] > 100].sort_values(by='ave_age', ascending=True).head(5) 
+0

Werfen Sie einen Blick auf die groupby. Ich glaube, 'df.title' wirft einen Fehler und wird sowieso nicht benötigt. Außerdem ist 'size' eine Datenrahmeneigenschaft, daher sollten Sie einen anderen Variablennamen verwenden. 'aufsteigend = Wahr 'ist der Standard-Parameterwert, ist also nicht erforderlich, aber es tut auch nicht weh, explizit zu sein. – Alexander

+0

Danke, @Alexander du hast Recht - korrigiert. Ich glaube, dass 'pd.read_clipboard()' seltsame Sachen in diesem speziellen Beispiel macht. Folglich habe ich einige Änderungen vorgenommen und anscheinend einen falsch verstanden. –

+0

Ich glaube, du willst 'agg = df.groupby ('Filmtitel'). Age.agg (...)' – Alexander

Verwandte Themen