Zeilen eines gruppierten DataFrames zählen und als separate Spalte hinzufügen

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
NinoBaumann
User
Beiträge: 71
Registriert: Samstag 25. April 2020, 19:03

Hallo,

ich hoffe das hier wird kein Zwillingsbeitrag eines Bestehenden. Aber zumindest habe ich keinen passenden Beitrag mit meinen Stichworten gefunden.
Wie der Name schon sagt, möchte ich eine Dataframe nach mehreren Spalten gruppieren, dann eine Berechnung über die übrigen Spalten durchführen und die Anzahl der gruppierten Zeilen zählen. Bis auf das Zählen klappt auch alles:

Code: Alles auswählen

dfData=dfData.groupby(['DatumSchicht','Schicht','MATERIALNUMMER'], sort=False)[['FTB_WULST_NIO',
                                                                                'FTB_HOEHE_NIO',
                                                                                'KLEBERAUPE_NIO',
                                                                                'WIEGEERGEBNIS_NIO',
                                                                                'PRESSERGEBNIS_P1_NIO',
                                                                                'PRESSERGEBNIS_P2_NIO',
                                                                                'PRESSERGEBNIS_P3_NIO',
                                                                                'PRESSERGEBNIS_P4_NIO',
                                                                                'KRAFTPRUEFUNG_FTB_NIO',
                                                                                'OPTISCHE_PRFG_VBG_NIO',
                                                                                'OPTPRFGVBG_ZAHNZAHL_NIO',
                                                                                'OPTPRFGVBG_KAEFIGTYP_NIO',
                                                                                'OPTPRFGVBG_DREHRILL_NIO',
                                                                                'OPTPRFGVBG_KUGELZAHL_NIO',
                                                                                'OPTPRFGVBG_DECKEL_NIO',
                                                                                'KANTENKONTROLLE_VBG_NIO',
                                                                                'OPTISCHE_PRFG_FTB_NIO',
                                                                                ]].agg(lambda x: max(x) - min(x))
Nach den Spalten 'DatumSchicht','Schicht','MATERIALNUMMER' wurde gruppiert. Jetzt möchte ich die Anzahl der darin enthaltenen Zeilen zählen und als Extraspalte mit dem Namen 'Anzahl' dem DataFrame hinzufügen. Ich habe gesehen, dass man .size() bis .count() nutzen kann. Obwohl size() wohl sicherer ist, falls man mal nan Werte hat. Aber ich bekomme das irgendwie nicht in den Code oben eingebaut. Ich bekomme immer einen TypeError: 'numpy.int32' object is not callable. Der hat ja sonst etwas mit [] und () zutun. Aber ich komme gerade nicht weiter. Kann mir jemand helfen?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn versucht? Den Code mit size() sehe ich nicht?
NinoBaumann
User
Beiträge: 71
Registriert: Samstag 25. April 2020, 19:03

Sirius3 hat geschrieben: Freitag 17. März 2023, 15:32 Was hast Du denn versucht? Den Code mit size() sehe ich nicht?
Ich habe den Codeteil gelöscht, da er nicht funktioniert hat.
NinoBaumann
User
Beiträge: 71
Registriert: Samstag 25. April 2020, 19:03

Sirius3 hat geschrieben: Freitag 17. März 2023, 15:32 Was hast Du denn versucht? Den Code mit size() sehe ich nicht?
Hallo Sirius,

ich habe es jetzt auf folgendem Weg gelöst:

Code: Alles auswählen

dfData1=dfData.groupby(['DatumSchicht','Schicht','MATERIALNUMMER'], sort=False).size().reset_index(name='Anzahl')

dfData=dfData.groupby(['DatumSchicht','Schicht','MATERIALNUMMER'], sort=False)[['FTB_WULST_NIO',            # Gruppierung nach Datum, Schicht, Teilenummer
                                                                                'FTB_HOEHE_NIO',
                                                                                'KLEBERAUPE_NIO',
                                                                                'WIEGEERGEBNIS_NIO',
                                                                                'PRESSERGEBNIS_P1_NIO',
                                                                                'PRESSERGEBNIS_P2_NIO',
                                                                                'PRESSERGEBNIS_P3_NIO',
                                                                                'PRESSERGEBNIS_P4_NIO',
                                                                                'KRAFTPRUEFUNG_FTB_NIO',
                                                                                'OPTISCHE_PRFG_VBG_NIO',
                                                                                'OPTPRFGVBG_ZAHNZAHL_NIO',
                                                                                'OPTPRFGVBG_KAEFIGTYP_NIO',
                                                                                'OPTPRFGVBG_DREHRILL_NIO',
                                                                                'OPTPRFGVBG_KUGELZAHL_NIO',
                                                                                'OPTPRFGVBG_DECKEL_NIO',
                                                                                'KANTENKONTROLLE_VBG_NIO',
                                                                                'OPTISCHE_PRFG_FTB_NIO',
                                                                                ]].agg(lambda x: max(x) - min(x))

dfData[['Anzahl']] = dfData1[['Anzahl']].values
Schöner wäre es natürlich in der gleichen Zeile wie der groupby Befehl steht. Aber wie gesagt, wenn ich versuche den Codeteil

Code: Alles auswählen

.size().reset_index(name='Anzahl')
in die Zeile zu schreiben kommt der Error.

Beste Grüße
Nino
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Schöner wäre es, wenn Du den groupby-Befehl in einer eigenen Zeile hättest:

Code: Alles auswählen

IMPORTANT_COLUMNS = [
    'FTB_WULST_NIO',
    'FTB_HOEHE_NIO',
    'KLEBERAUPE_NIO',
    'WIEGEERGEBNIS_NIO',
    'PRESSERGEBNIS_P1_NIO',
    'PRESSERGEBNIS_P2_NIO',
    'PRESSERGEBNIS_P3_NIO',
    'PRESSERGEBNIS_P4_NIO',
    'KRAFTPRUEFUNG_FTB_NIO',
    'OPTISCHE_PRFG_VBG_NIO',
    'OPTPRFGVBG_ZAHNZAHL_NIO',
    'OPTPRFGVBG_KAEFIGTYP_NIO',
    'OPTPRFGVBG_DREHRILL_NIO',
    'OPTPRFGVBG_KUGELZAHL_NIO',
    'OPTPRFGVBG_DECKEL_NIO',
    'KANTENKONTROLLE_VBG_NIO',
    'OPTISCHE_PRFG_FTB_NIO',
]
groups = data.groupby(['DatumSchicht','Schicht','MATERIALNUMMER'], sort=False)
grouped_data = groups[IMPORTANT_COLUMNS].agg(np.ptp)
grouped_data['Anzahl'] = groups.size()
NinoBaumann
User
Beiträge: 71
Registriert: Samstag 25. April 2020, 19:03

Sirius3 hat geschrieben: Montag 20. März 2023, 09:03 Schöner wäre es, wenn Du den groupby-Befehl in einer eigenen Zeile hättest:

Code: Alles auswählen

IMPORTANT_COLUMNS = [
    'FTB_WULST_NIO',
    'FTB_HOEHE_NIO',
    'KLEBERAUPE_NIO',
    'WIEGEERGEBNIS_NIO',
    'PRESSERGEBNIS_P1_NIO',
    'PRESSERGEBNIS_P2_NIO',
    'PRESSERGEBNIS_P3_NIO',
    'PRESSERGEBNIS_P4_NIO',
    'KRAFTPRUEFUNG_FTB_NIO',
    'OPTISCHE_PRFG_VBG_NIO',
    'OPTPRFGVBG_ZAHNZAHL_NIO',
    'OPTPRFGVBG_KAEFIGTYP_NIO',
    'OPTPRFGVBG_DREHRILL_NIO',
    'OPTPRFGVBG_KUGELZAHL_NIO',
    'OPTPRFGVBG_DECKEL_NIO',
    'KANTENKONTROLLE_VBG_NIO',
    'OPTISCHE_PRFG_FTB_NIO',
]
groups = data.groupby(['DatumSchicht','Schicht','MATERIALNUMMER'], sort=False)
grouped_data = groups[IMPORTANT_COLUMNS].agg(np.ptp)
grouped_data['Anzahl'] = groups.size()
ja, das ist auch eine schöne Variante. Danke :D
Antworten