groupby.agg()

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
lambkin
User
Beiträge: 17
Registriert: Dienstag 22. Mai 2018, 08:29

Mein Dataframe:
Projektnr | Teilprojektnr | Abteilung | Mitarbeiter |
1 | a | A | 1
1 | a | B | 1
1 | a | C | 2
1 | b | A | 1
1 | b | B | 1
2 | c | A | 3

Mein Ziel:
Projektnr | Anzahl Teilprojektnur | Anzahl Abteilungen | max Mitarbeiter
1 | 2 | 5 | 2
2 | 1 | 1 | 3

Ich möchte als alle gleichen Projektnummern gruppieren, in der zweiten Spalte die Anzahl! der unterschiedlichen Teilprojektnummern ausgeben,
dann die Anzahl der Abteilungen(hier kann ich einfach durchzählen, da die Anzahl der Beauftragungen relevant ist und es keine Rolle spielt, ob es mehrmals die selbe Abteilung ist) und zuletzt die max. Anzahl an Mitarbeitern (hier möchte ich tatsächlich nur den höchsten Wert).
Schwierigkeiten macht mir nun die zweite Spalte. Wie kann ich denn prüfen, wie viele unterschiedliche Teileprojektnr. ich zu einer Projektnr habe.
Ein erster Gedanke wäre jetzt eine funktion schreiben mit if, else und einem counter. Allerdings wüsste ich jetzt gar nicht wie ich zeilenweise vergleichen soll.
Gibt es eine elegantere Lösung?

Bisher habe ich folgendes:

Code: Alles auswählen

gruppiert = df.groupby("Projektnr").agg({"Abteilung":["count"], "Mitarbeiter":["max"]})
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo lambkin,
ich bin auf dem Gebiet jetzt nicht so der Spezialist, aber vielleicht kannst du über die "groups" iterieren und dann die Teilprojektnummern zählen?
Also etwa sinngemäß folgendes:

Code: Alles auswählen

gruppiert = df.groupby(['Projektnummer'])
for name, group in gruppiert:
    zeile = name,'|',len(group['Teilprojektnummer'].unique()),'|',group['Abteilung'].agg('count'),'|',group['Mitarbeiter'].agg('max')
    print(zeile)
=>
('1', '|', 2, '|', 5, '|', 2)
('2', '|', 1, '|', 1, '|', 3)
Vielleicht hilft's ja weiter :)
Viele Grüße
Piet Lotus
lambkin
User
Beiträge: 17
Registriert: Dienstag 22. Mai 2018, 08:29

Danke, die Ausgabe ist tatsächlich so, wie ich sie gerne hätte! Aber kann ich die Ausgabe auch in einen Dataframe packen?
So dass alle Werte also gleich in einen neuen Dataframe gespeichert werden. Denn ich würde ja gerne mit den Werten weiterarbeiten.
Sorry, ich bin noch Anfängern und habe leider keine Infos dazu selber gefunden.
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo lambkin,
klar kannst du das Ergebnis auch wieder in einen Dataframe packen. Wie hast du denn dein ursprüngliches Dataframe erzeugt?
Du könntest dort wo "mein" print-Befehl steht natürlich auch eine Liste oder ein Dictionary befüllen und am Ende der Iteration über die groups damit dann ein Dataframe erzeugen.
Viele Grüße
Piet Lotus
Antworten