Schnelle Antwort:
Der einfachste Weg, um Zeilenanzahlen pro Gruppe zu erhalten, besteht darin, .size()
aufzurufen, was eine Series
zurückgibt:
df.groupby(['col1','col2']).size()
Normalerweise möchten Sie dieses Ergebnis als DataFrame
(anstelle einer Series
) haben, damit Sie Folgendes tun können:
df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Wenn Sie herausfinden möchten, wie die Zeilenanzahlen und andere Statistiken für jede Gruppe berechnet werden, lesen Sie weiter unten.
Detailliertes Beispiel:
Betrachten Sie das folgende Beispiel-DataFrame:
In [2]: df
Out[2]:
col1 col2 col3 col4 col5 col6
0 A B 0.20 -0.61 -0.49 1.49
1 A B -1.53 -1.01 -0.39 1.82
2 A B -0.44 0.27 0.72 0.11
3 A B 0.28 -1.32 0.38 0.18
4 C D 0.12 0.59 0.81 0.66
5 C D -0.13 -1.65 -1.64 0.50
6 C D -1.42 -0.11 -0.18 -0.44
7 E F -0.00 1.42 -0.26 1.17
8 E F 0.91 -0.47 1.35 -0.34
9 G H 1.48 -0.63 -1.14 0.17
Zuerst verwenden wir .size()
, um die Zeilenanzahlen zu erhalten:
In [3]: df.groupby(['col1', 'col2']).size()
Out[3]:
col1 col2
A B 4
C D 3
E F 2
G H 1
dtype: int64
Dann verwenden wir .size().reset_index(name='counts')
, um die Zeilenanzahlen zu erhalten:
In [4]: df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Out[4]:
col1 col2 counts
0 A B 4
1 C D 3
2 E F 2
3 G H 1
Ergebnisse für weitere Statistiken einschließen
Wenn Sie Statistiken zu gruppierten Daten berechnen möchten, sieht es normalerweise so aus:
In [5]: (df
...: .groupby(['col1', 'col2'])
...: .agg({
...: 'col3': ['mean', 'count'],
...: 'col4': ['median', 'min', 'count']
...: }))
Out[5]:
col4 col3
median min count mean count
col1 col2
A B -0.810 -1.32 4 -0.372500 4
C D -0.110 -1.65 3 -0.476667 3
E F 0.475 -0.47 2 0.455000 2
G H -0.630 -0.63 1 1.480000 1
Das oben gezeigte Ergebnis ist etwas mühsam zu handhaben, aufgrund der verschachtelten Spaltenbeschriftungen und auch, weil die Zeilenanzahlen auf einer pro Spalte basieren.
Um mehr Kontrolle über die Ausgabe zu erlangen, unterteile ich die Statistiken normalerweise in einzelne Aggregationen, die ich dann mit join
kombiniere. Es sieht folgendermaßen aus:
In [6]: gb = df.groupby(['col1', 'col2'])
...: counts = gb.size().to_frame(name='counts')
...: (counts
...: .join(gb.agg({'col3': 'mean'}).rename(columns={'col3': 'col3_mean'}))
...: .join(gb.agg({'col4': 'median'}).rename(columns={'col4': 'col4_median'}))
...: .join(gb.agg({'col4': 'min'}).rename(columns={'col4': 'col4_min'}))
...: .reset_index()
...: )
...:
Out[6]:
col1 col2 counts col3_mean col4_median col4_min
0 A B 4 -0.372500 -0.810 -1.32
1 C D 3 -0.476667 -0.110 -1.65
2 E F 2 0.455000 0.475 -0.47
3 G H 1 1.480000 -0.630 -0.63
Fußnoten
Der Code, der verwendet wurde, um die Testdaten zu generieren, wird unten angezeigt:
In [1]: import numpy as np
...: import pandas as pd
...:
...: keys = np.array([
...: ['A', 'B'],
...: ['A', 'B'],
...: ['A', 'B'],
...: ['A', 'B'],
...: ['C', 'D'],
...: ['C', 'D'],
...: ['C', 'D'],
...: ['E', 'F'],
...: ['E', 'F'],
...: ['G', 'H']
...: ])
...:
...: df = pd.DataFrame(
...: np.hstack([keys,np.random.randn(10,4).round(2)]),
...: columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6']
...: )
...:
...: df[['col3', 'col4', 'col5', 'col6']] = \
...: df[['col3', 'col4', 'col5', 'col6']].astype(float)
...:
Haftungsausschluss:
Wenn einige der Spalten, die Sie aggregieren, NaN-Werte enthalten, sollten Sie wirklich die Gruppenzeilenanzahlen als unabhängige Aggregation für jede Spalte betrachten. Andernfalls könnten Sie darüber getäuscht werden, wie viele Datensätze tatsächlich zur Berechnung von Dingen wie dem Mittelwert verwendet werden, da Pandas NaN-Einträge bei der Mittelwertberechnung ohne Hinweis entfernt.