DataFrame Teilmenge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Hallo zusammen,

fast habe ich mein Ziel schon selber erreicht. Leider etwas "unschön" aber ich stehe ja noch am Anfang!

Ich habe einen DataFrame (356, 22).
Diesen habe ich mit:

Code: Alles auswählen

df_Sort = df_1.sort_values(by=['Jahr', 'Rho_Summe'], ascending=[True, False])

innerhalb jeden Jahres sortiert.

Je Jahr gibt es ca. 73 Einträge.

Ich hätte gerne für jedes Jahr die Datensätze mit den 5 größten und 5 kleinsten Werten der Spalte Rho_Summe in einem neuen DataFrame.

Mit

Code: Alles auswählen

df_test = df_Sort.query('Jahr == 2014').head(5)
, bzw. tail(5) kann ich je ein Jahr "rausziehen".

Bestimmt gibt es eine elegantere Lösung ?

Vielen Dank für Eure Hilfe
Hias
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hias_L: Das klingt nach einem Fall für `groupby()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Vielen Dank schon einmal @__blackjack__

Groupby hätte ich jetzt z.B. so verstanden:

Code: Alles auswählen

df_gruppiert = df_Sort.groupby('Jahr').mean()
Aber wie kann ich mir mit groupby z.B. die 5 größten Werte für df_Sort('Rho_Summe') für jedes Jahr anzeigen lassen?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hias_L: Na mit `head()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Das ist ja unglaublich, was man mit groupby alles machen kann!

Habs hinbekommen:

Code: Alles auswählen

groupHead = df_Sort.groupby(['Jahr'])
df_Top5jeJahr = groupHeadTail.head(5)
Kann man head(5) und tail(5) in einem Schritt hinbekommen?
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Ist jetzt so gelöst:

Code: Alles auswählen

frames = [df_Top5jeJahr, df_Low5jeJahr]
df_Top5_Low5 = pd.concat(frames)
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hias_L: `head()` und `tail()` kann man mit `nth()` und einer entsprechenden Liste von Indexwerten ersetzen, wenn man das in einem Schritt machen möchte.

Ich würde als Paranoiker vorher noch prüfen ob den auch alle Gruppen mindestens 10 Datensätze enthalten. Auch wenn das eigentlich nie anders sein dürfte – so ein kleines Sicherheitsnetz ist manchmal sinnvoll.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Danke @__blackjack__ das mit 'nth()' schaue ich mir an!

Vieles findet man selber und es klappt, zumindest manchmal, dann tatsächlich.
Aber oft spart man mit den Hinweisen hier viel Zeit!

Was die Überprüfung betrifft zähle ich mich auch zu den Paranoikern. Aber trotzdem, der Hinweis ist immer wieder gut.
Antworten