Schnelle Antwort:
Der einfachste Weg, um die Anzahl der Zeilen pro Gruppe zu ermitteln, ist ein Aufruf .size()
, der Folgendes zurückgibt Series
:
df.groupby(['col1','col2']).size()
Normalerweise möchten Sie dieses Ergebnis als DataFrame
(anstelle von Series
), damit Sie Folgendes tun können:
df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Wenn Sie herausfinden möchten, wie die Zeilenanzahl und andere Statistiken für jede Gruppe berechnet werden, lesen Sie weiter unten.
Detailliertes Beispiel:
Betrachten Sie den folgenden Beispieldatenrahmen:
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
Lassen Sie .size()
uns zuerst die Zeilenanzahl ermitteln:
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 Zeilenanzahl 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
Einschließlich Ergebnisse für weitere Statistiken
Wenn Sie Statistiken zu gruppierten Daten berechnen möchten, sieht dies normalerweise folgendermaßen 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 obige Ergebnis ist aufgrund der verschachtelten Spaltenbeschriftungen und auch der Zeilenanzahl pro Spalte etwas ärgerlich.
Um mehr Kontrolle über die Ausgabe zu erhalten, teile ich die Statistiken normalerweise in einzelne Aggregationen auf, die ich dann mit kombiniere join
. Es sieht aus wie das:
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 zum Generieren der Testdaten verwendete Code wird unten gezeigt:
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, Nullwerte haben, möchten Sie wirklich die Anzahl der Gruppenzeilen als unabhängige Aggregation für jede Spalte betrachten. Andernfalls werden Sie möglicherweise irregeführt, wie viele Datensätze tatsächlich zur Berechnung des Mittelwerts verwendet werden, da Pandas NaN
Einträge in der Mittelwertberechnung löschen, ohne Sie darüber zu informieren.
df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])