Come posso ottenere il conteggio delle righe di un DataFrame Panda?
Questa tabella riassume le diverse situazioni in cui vorresti contare qualcosa in un DataFrame (o Serie, per completezza), insieme ai metodi consigliati.
Le note
DataFrame.count
restituisce i conteggi per ogni colonna come a Series
poiché il conteggio non nullo varia in base alla colonna.
DataFrameGroupBy.size
restituisce a Series
, poiché tutte le colonne dello stesso gruppo condividono lo stesso conteggio di righe.
DataFrameGroupBy.count
restituisce a DataFrame
, poiché il conteggio non nullo potrebbe differire tra le colonne dello stesso gruppo. Per ottenere il conteggio non nullo a livello di gruppo per una colonna specifica, utilizzare df.groupby(...)['x'].count()
dove "x" è la colonna da contare.
Esempi di codice minimo
Di seguito, mostro esempi di ciascuno dei metodi descritti nella tabella sopra. Innanzitutto, l'installazione -
df = pd.DataFrame({
'A': list('aabbc'), 'B': ['x', 'x', np.nan, 'x', np.nan]})
s = df['B'].copy()
df
A B
0 a x
1 a x
2 b NaN
3 b x
4 c NaN
s
0 x
1 x
2 NaN
3 x
4 NaN
Name: B, dtype: object
Conteggio righe di un dataframe: len(df)
, df.shape[0]
, olen(df.index)
len(df)
# 5
df.shape[0]
# 5
len(df.index)
# 5
Sembra sciocco confrontare le prestazioni delle operazioni a tempo costante, specialmente quando la differenza è sul livello di "seriamente, non preoccuparti". Ma questa sembra essere una tendenza con altre risposte, quindi sto facendo lo stesso per completezza.
Dei 3 metodi sopra, len(df.index)
(come menzionato in altre risposte) è il più veloce.
Nota
- Tutti i metodi sopra indicati sono operazioni a tempo costante in quanto sono semplici ricerche di attributi.
df.shape
(simile a ndarray.shape
) è un attributo che restituisce una tupla di (# Rows, # Cols)
. Ad esempio, df.shape
ritorna (8,
2)
per l'esempio qui.
Conte Colonna di un dataframe: df.shape[1]
,len(df.columns)
df.shape[1]
# 2
len(df.columns)
# 2
Analogamente a len(df.index)
, len(df.columns)
è il più veloce dei due metodi (ma richiede più caratteri per digitare).
Numero di righe di una Serie: len(s)
, s.size
,len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size
e len(s.index)
sono più o meno gli stessi in termini di velocità. Ma io consiglio len(df)
.
Nota
size
è un attributo e restituisce il numero di elementi (= conteggio delle righe per qualsiasi serie). DataFrames definisce anche un attributo size che restituisce lo stesso risultato di df.shape[0] * df.shape[1]
.
Conteggio righe non null: DataFrame.count
eSeries.count
I metodi qui descritti contano solo valori non nulli (il che significa che i NaN vengono ignorati).
La chiamata DataFrame.count
restituirà conteggi non NaN per ogni colonna:
df.count()
A 5
B 3
dtype: int64
Per le serie, utilizzare Series.count
con effetti simili:
s.count()
# 3
Conteggio righe di gruppo: GroupBy.size
Per DataFrames
, usare DataFrameGroupBy.size
per contare il numero di righe per gruppo.
df.groupby('A').size()
A
a 2
b 2
c 1
dtype: int64
Allo stesso modo, per Series
, userete SeriesGroupBy.size
.
s.groupby(df.A).size()
A
a 2
b 2
c 1
Name: B, dtype: int64
In entrambi i casi, Series
viene restituito a. Questo ha senso DataFrames
anche perché tutti i gruppi condividono lo stesso numero di righe.
Conteggio delle righe non nulle del gruppo: GroupBy.count
Simile a sopra, ma usare GroupBy.count
, non GroupBy.size
. Nota che size
restituisce sempre a Series
, mentre count
restituisce a Series
se chiamato su una colonna specifica, oppure a DataFrame
.
I seguenti metodi restituiscono la stessa cosa:
df.groupby('A')['B'].size()
df.groupby('A').size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Nel frattempo, per count
, abbiamo
df.groupby('A').count()
B
A
a 2
b 1
c 0
... chiamato sull'intero oggetto GroupBy, v / s,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
Chiamato su una colonna specifica.