807 Stimmen

Holen Sie sich Statistiken für jede Gruppe (wie Anzahl, Mittelwert usw.) mit Pandas GroupBy?

Ich habe einen DataFrame df und ich verwende mehrere Spalten daraus, um mit groupby zu gruppieren:

df['col1','col2','col3','col4'].groupby(['col1','col2']).mean()

Auf diese Weise erhalte ich fast die Tabelle (DataFrame), die ich brauche. Was fehlt, ist eine zusätzliche Spalte, die die Anzahl der Zeilen in jeder Gruppe enthält. Mit anderen Worten, ich habe den Mittelwert, aber ich möchte auch wissen, wie viele verwendet wurden, um diese Mittelwerte zu erhalten. Zum Beispiel gibt es in der ersten Gruppe 8 Werte und in der zweiten 10 usw.

Kurz gesagt: Wie erhalte ich gruppenweise Statistiken für einen DataFrame?

6voto

Ichsan Punkte 708

Bitte versuchen Sie diesen Code

new_column=df[['col1', 'col2', 'col3', 'col4']].groupby(['col1', 'col2']).count()
df['count_it']=new_column
df

Ich denke, dass dieser Code eine Spalte namens 'count it' hinzufügen wird, die die Anzahl jeder Gruppe zählt

4voto

Mahendra Punkte 161

Erstellen Sie ein Gruppenobjekt und rufen Sie Methoden wie im folgenden Beispiel auf:

grp = df.groupby(['col1',  'col2',  'col3']) 

grp.max() 
grp.mean() 
grp.describe()

3voto

Panwen Wang Punkte 3078

Wenn Sie mit tidyverse R-Paketen vertraut sind, gibt es eine Möglichkeit, dies in Python zu tun:

from datar.all import tibble, rnorm, f, group_by, summarise, mean, n, rep

df = tibble(
  col1=rep(['A', 'B'], 5), 
  col2=rep(['C', 'D'], each=5), 
  col3=rnorm(10), 
  col4=rnorm(10)
)
df >> group_by(f.col1, f.col2) >> summarise(
  count=n(),
  col3_mean=mean(f.col3), 
  col4_mean=mean(f.col4)
)

  col1 col2  n  mean_col3  mean_col4
0    A    C  3  -0.516402   0.468454
1    A    D  2  -0.248848   0.979655
2    B    C  2   0.545518  -0.966536
3    B    D  3  -0.349836  -0.915293
[Groups: ['col1'] (n=2)]

Ich bin der Autor des datar Pakets. Bitte zögern Sie nicht, Probleme zu melden, wenn Sie Fragen zur Verwendung haben.

1voto

not a robot Punkte 3525

pivot_table mit spezifischen aggfuncs

Für einen DataFrame mit aggregierten Statistiken kann auch pivot_table verwendet werden. Es erzeugt eine Tabelle, die nicht ganz unähnlich einer Excel-Pivot-Tabelle ist. Die Grundidee ist, die zu aggregerenden Spalten als values= sowie die Gruppierungs-Spalten als index= und die Aggregationsfunktionen als aggfunc= (alle optimierten Funktionen, die für groupby.agg zulässig sind, sind OK) zu übergeben.

Ein Vorteil von pivot_table gegenüber groupby.agg ist, dass es für mehrere Spalten eine einzelne size-Spalte erzeugt, während groupby.agg eine size-Spalte für jede Spalte erzeugt (bis auf eine sind alle überflüssig).

agg_df = df.pivot_table(
    values=['col3', 'col4', 'col5'], 
    index=['col1', 'col2'], 
    aggfunc=['size', 'mean', 'median']
).reset_index()
# Flachmachen der MultiIndex-Spalte (sollte ausgelassen werden, wenn MultiIndex bevorzugt wird)
agg_df.columns = [i if not j else f"{j}_{i}" for i,j in agg_df.columns]

res1

Benutzung von benannter Aggregation für benutzerdefinierte Spaltennamen

Statt mehrerer rename-Aufrufe für benutzerdefinierte Spaltennamen, verwende von Anfang an benannte Aggregation.

Aus den Dokumenten:

Um die aggregierte Datanbankunterstützung mit Kontrolle über die Ausgabespaltennamen zu unterstützen, akzeptiert pandas die spezielle Syntax in GroupBy.agg(), bekannt als "benannte Aggregation", bei der

  • Die Schlüsselwörter die Ausgabespaltennamen sind
  • Die Werte sind Tupel, deren erstes Element die auszuwählende Spalte und das zweite Element die anzuwendende Aggregation sind. pandas bietet das pandas.NamedAgg namedtuple mit den Feldern ['column', 'aggfunc'] an, um klarer zu machen, was die Argumente sind. Wie üblich kann die Aggregation ein Aufruf oder ein Alias als String sein.

Ein Beispiel wäre, um einen aggregierten DataFrame zu erstellen, in dem jeweils der Mittelwert und die Anzahl von col3, col4 und col5 berechnet werden, könnte der folgende Code verwendet werden. Beachte, dass die Umbenennung der Spalten als Teil von groupby.agg durchgeführt wird.

aggfuncs = {f'{c}_{f}': (c, f) for c in ['col3', 'col4', 'col5'] for f in ['mean', 'count']}
agg_df = df.groupby(['col1', 'col2'], as_index=False).agg(**aggfuncs)

res3

Ein weiteres Anwendungsbeispiel von benannter Aggregation besteht darin, wenn jede Spalte eine andere Aggregationsfunktion benötigt. Zum Beispiel, wenn nur der Durchschnitt von col3, der Median von col4 und das Minimum von col5 mit benutzerdefinierten Spaltennamen benötigt werden, kann dies mit dem folgenden Code durchgeführt werden.

agg_df = df.groupby(['col1', 'col2'], as_index=False).agg(col3_mean=('col3', 'mean'), col4_median=('col4', 'median'), col5_min=('col5', 'min'))
# oder äquivalent,
agg_df = df.groupby(['col1', 'col2'], as_index=False).agg(**{'_'.join(p): p for p in [('col3', 'mean'), ('col4', 'median'), ('col5', 'min')]})

res2

1voto

rafine Punkte 361
df_group = (df.groupby(['city','gender'])[['age',"grade"]]
     .agg([('average','mean'),('freq','count')])
     .reset_index())

city und gender sind die Gruppenspalten.

age und grade sind die abhängigen Spalten (auf die ich den Durchschnitt berechne).

Der Name der Mittelwertspalte wäre Durchschnitt Der Name der Zählsäule wäre Häufigkeit

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X