Pandas: Erstellen Sie Spalten mit einer Größe und einer Summe nach der Gruppierung nach mehreren Spalten

Baig

Ich habe einen Datenrahmen, in dem ich Groupby für 3 Spalten durchführe und die Summe und Größe der numerischen Spalten aggregiere. Nach dem Ausführen des Codes

df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])

Ich bekomme so etwas wie unten:

Bild des Datenrahmens

Jetzt möchte ich meine Größenunterspalten von den Hauptspalten trennen und nur eine Einzelgrößenspalte erstellen, aber die Summenspalten unter den Hauptspaltenüberschriften behalten. Ich habe verschiedene Ansätze ausprobiert, aber nicht erfolgreich. Dies sind die Methoden, die ich ausprobiert habe, aber nicht in der Lage bin, Dinge für mich zum Laufen zu bringen:

Wie zähle ich die Anzahl der Zeilen in einer Gruppe in Pandas nach Objekt?

Konvertieren eines Pandas GroupBy-Objekts in DataFrame

Ich bin dankbar, wenn mir jemand dabei helfen kann.

Grüße,

piRSquared

Installieren

d1 = pd.DataFrame(dict(
        year=np.random.choice((2014, 2015, 2016), 100),
        cntry=['United States' for _ in range(100)],
        State=np.random.choice(states, 100),
        Col1=np.random.randint(0, 20, 100),
        Col2=np.random.randint(0, 20, 100),
        Col3=np.random.randint(0, 20, 100),
    ))

df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum'])
df

Geben Sie hier die Bildbeschreibung ein


Antwort
Der einfachste Weg wäre gewesen, nur laufensizenachgroupby

d1.groupby(['year', 'cntry', 'State']).size()

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
dtype: int64

Um das berechnete zu verwenden df

df.xs('size', axis=1, level=1)

Geben Sie hier die Bildbeschreibung ein

Und das wäre nützlich, wenn die sizefür jede Spalte unterschiedlich wären . Aber weil die sizeSpalte für dieselbe ist ['Col1', 'Col2', 'Col3'], können wir es einfach tun

df[('Col1', 'size')]

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
Name: (Col1, size), dtype: int64

Kombinierte Ansicht 1

pd.concat([df[('Col1', 'size')].rename('size'),
           df.xs('sum', axis=1, level=1)], axis=1)

Geben Sie hier die Bildbeschreibung ein


Kombinierte Ansicht 2

pd.concat([df[('Col1', 'size')].rename(('', 'size')),
           df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)

Geben Sie hier die Bildbeschreibung ein

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel