Como obtenho a contagem de linhas de um DataFrame do pandas?
Esta tabela resume as diferentes situações nas quais você deseja contar algo em um DataFrame (ou em série, para completar), juntamente com o (s) método (s) recomendado (s).
Notas de rodapé
DataFrame.count
retorna contagens para cada coluna como a Series
desde que a contagem não nula varia de acordo com a coluna.
DataFrameGroupBy.size
retorna a Series
, pois todas as colunas do mesmo grupo compartilham a mesma contagem de linhas.
DataFrameGroupBy.count
retorna a DataFrame
, pois a contagem não nula pode diferir nas colunas do mesmo grupo. Para obter a contagem não nula em grupo para uma coluna específica, use df.groupby(...)['x'].count()
onde "x" é a coluna a ser contada.
Exemplos de código mínimo
Abaixo, mostro exemplos de cada um dos métodos descritos na tabela acima. Primeiro, a configuração -
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
Conde linha de uma trama de dados: len(df)
, df.shape[0]
oulen(df.index)
len(df)
# 5
df.shape[0]
# 5
len(df.index)
# 5
Parece tolice comparar o desempenho de operações de tempo constante, especialmente quando a diferença está no nível de "sério, não se preocupe com isso". Mas essa parece ser uma tendência com outras respostas, por isso estou fazendo o mesmo por completude.
Dos três métodos acima, len(df.index)
(como mencionado em outras respostas), é o mais rápido.
Nota
- Todos os métodos acima são operações de tempo constante, pois são simples pesquisas de atributo.
df.shape
(similar a ndarray.shape
) é um atributo que retorna uma tupla de (# Rows, # Cols)
. Por exemplo, df.shape
retorna (8,
2)
para o exemplo aqui.
Coluna Contagem de uma trama de dados: df.shape[1]
,len(df.columns)
df.shape[1]
# 2
len(df.columns)
# 2
Análogo a len(df.index)
, len(df.columns)
é o mais rápido dos dois métodos (mas leva mais caracteres para digitar).
Contagem de linhas de uma série: len(s)
, s.size
,len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size
e len(s.index)
são praticamente os mesmos em termos de velocidade. Mas eu recomendo len(df)
.
Note
size
é um atributo e retorna o número de elementos (= contagem de linhas para qualquer série). Os DataFrames também definem um atributo de tamanho que retorna o mesmo resultado que df.shape[0] * df.shape[1]
.
Contagem de linhas não nulas: DataFrame.count
eSeries.count
Os métodos descritos aqui contam apenas valores não nulos (significando que os NaNs são ignorados).
A chamada DataFrame.count
retornará contagens não-NaN para cada coluna:
df.count()
A 5
B 3
dtype: int64
Para Série, use Series.count
para efeito semelhante:
s.count()
# 3
Contagem de linhas em grupo: GroupBy.size
Para DataFrames
, use DataFrameGroupBy.size
para contar o número de linhas por grupo.
df.groupby('A').size()
A
a 2
b 2
c 1
dtype: int64
Da mesma forma, para Series
, você usará SeriesGroupBy.size
.
s.groupby(df.A).size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Nos dois casos, a Series
é retornado. Isso faz sentido paraDataFrames
, pois todos os grupos compartilham a mesma contagem de linhas.
Contagem de linhas não nulas em grupo: GroupBy.count
Semelhante ao anterior, mas use GroupBy.count
, não GroupBy.size
. Observe que size
sempre retorna a Series
, while count
retorna a Series
se chamado em uma coluna específica, ou então a DataFrame
.
Os seguintes métodos retornam a mesma coisa:
df.groupby('A')['B'].size()
df.groupby('A').size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Enquanto isso, count
temos
df.groupby('A').count()
B
A
a 2
b 1
c 0
... chamou o objeto GroupBy inteiro, v / s,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
Chamado em uma coluna específica.