A documentação dizia que o tamanho "retorna o número de elementos no NDFrame" e conta "retorna a série com o número de observações não NA / nulas sobre o eixo solicitado. Funciona com dados de ponto não flutuante também (detecta NaN e Nenhum)"
hamsternik
Além da resposta aceita, há algumas outras distinções interessantes destacadas em minha resposta aqui .
In [46]:
df = pd.DataFrame({'a':[0,0,1,2,2,2], 'b':[1,2,3,4,np.NaN,4], 'c':np.random.randn(6)})
df
Out[46]:
a b c
0011.0676271020.5546912130.4580843240.42663542 NaN -2.2380915241.256943
In [48]:
print(df.groupby(['a'])['b'].count())
print(df.groupby(['a'])['b'].size())
a
021122
Name: b, dtype: int64
a
021123
dtype: int64
Acho que a contagem também retorna um DataFrame enquanto dimensiona uma série?
Mr_and_Mrs_D
1
A função .size () obtém o valor agregado de uma coluna particular apenas enquanto .column () é usado para cada coluna.
Nachiket
@Mr_and_Mrs_D size retorna um inteiro
boardtc
@boardtc df.size retorna um número - os métodos de agrupamento são discutidos aqui, consulte os links na pergunta.
Mr_and_Mrs_D
Quanto à minha pergunta - a contagem e o tamanho realmente retornam DataFrame e Series respectivamente quando "vinculados" a uma instância DataFrameGroupBy - na questão são vinculados a SeriesGroupBy, de modo que ambos retornam uma instância Series
Mr_and_Mrs_D
25
Qual é a diferença entre size e count in pandas?
As outras respostas apontaram a diferença, no entanto, não é totalmente correto dizer " sizeconta NaNs enquanto countnão". Embora sizerealmente conte NaNs, isso é realmente uma consequência do fato de que sizeretorna o tamanho (ou o comprimento) do objeto no qual é chamado. Naturalmente, isso também inclui linhas / valores que são NaN.
Portanto, para resumir, sizeretorna o tamanho do Series / DataFrame 1 ,
df = pd.DataFrame({'A': ['x', 'y', np.nan, 'z']})
df
A
0 x
1 y
2 NaN
3 z
df.A.size
# 4
... enquanto countconta os valores não NaN:
df.A.count()
# 3
Observe que sizeé um atributo (dá o mesmo resultado que len(df)ou len(df.A)). counté uma função.
1. DataFrame.sizetambém é um atributo e retorna o número de elementos no DataFrame (linhas x colunas).
Comportamento com GroupBy- Estrutura de Saída
Além da diferença básica, há também a diferença na estrutura da saída gerada quando chamado GroupBy.size()vs GroupBy.count().
df = pd.DataFrame({'A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x']})
df
A B
0 a x
1 a x
2 a NaN
3 b NaN
4 b NaN
5 c NaN
6 c x
7 c x
Considerar,
df.groupby('A').size()
A
a 3
b 2
c 3
dtype: int64
Versus,
df.groupby('A').count()
B
A
a 2
b 0
c 2
GroupBy.countretorna um DataFrame quando você chama countem todas as colunas, enquanto GroupBy.sizeretorna um Series.
O motivo é que sizeé o mesmo para todas as colunas, portanto, apenas um único resultado é retornado. Enquanto isso, o counté chamado para cada coluna, pois os resultados dependeriam de quantos NaNs cada coluna tem.
Comportamento com pivot_table
Outro exemplo é como pivot_tabletrata esses dados. Suponha que gostaríamos de calcular a tabulação cruzada de
df
A B
001101212302400
pd.crosstab(df.A, df.B) # Result we expect, but with `pivot_table`.
B 012
A
01211001
Com pivot_table, você pode emitir size:
df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0)
B 012
A
01211001
Mas countnão funciona; um DataFrame vazio é retornado:
Acredito que a razão para isso é que 'count'deve ser feito na série que é passada para o valuesargumento, e quando nada é passado, os pandas decidem não fazer suposições.
Apenas para adicionar um pouco à resposta de @Edchum, mesmo que os dados não tenham valores NA, o resultado de count () é mais detalhado, usando o exemplo anterior:
grouped = df.groupby('a')
grouped.count()
Out[197]:
b c
a
022111223
grouped.size()
Out[198]:
a
021123
dtype: int64
Parece sizeum equivalente elegante de countnos pandas.
QM.py
@ QM.py NÃO, não é. O motivo da diferença na groupbysaída é explicado aqui .
cs95 de
1
Quando estamos lidando com dataframes normais, então apenas a diferença será uma inclusão de valores NAN, significa que a contagem não inclui valores NAN ao contar linhas.
Mas se estivermos usando essas funções com o groupbythen, para obter os resultados corretos count(), temos que associar qualquer campo numérico ao groupbypara obter o número exato de grupos onde para size()não há necessidade desse tipo de associação.
Além de todas as respostas acima, gostaria de apontar mais uma diferença que me parece significativa.
Você pode correlacionar o Datarametamanho do Panda e contar com o do JavaVectors tamanho e comprimento . Quando criamos o vetor, alguma memória predefinida é alocada a ele. quando chegamos mais perto do número de elementos que ele pode ocupar enquanto adicionamos elementos, mais memória é alocada para ele. Da mesma forma, emDataFrame medida que adicionamos elementos, a memória alocada a ele aumenta.
O atributo de tamanho fornece o número de células de memória alocadas, DataFrameenquanto a contagem fornece o número de elementos que estão realmente presentes DataFrame. Por exemplo,
Você pode ver que existem 3 linhas em DataFrame , seu tamanho é 6.
Esta resposta cobre a diferença de tamanho e contagem em relação a DataFramee não Pandas Series. Eu não verifiquei o que acontece comSeries
Respostas:
size
incluiNaN
valores,count
não:In [46]: df = pd.DataFrame({'a':[0,0,1,2,2,2], 'b':[1,2,3,4,np.NaN,4], 'c':np.random.randn(6)}) df Out[46]: a b c 0 0 1 1.067627 1 0 2 0.554691 2 1 3 0.458084 3 2 4 0.426635 4 2 NaN -2.238091 5 2 4 1.256943 In [48]: print(df.groupby(['a'])['b'].count()) print(df.groupby(['a'])['b'].size()) a 0 2 1 1 2 2 Name: b, dtype: int64 a 0 2 1 1 2 3 dtype: int64
fonte
As outras respostas apontaram a diferença, no entanto, não é totalmente correto dizer "
size
conta NaNs enquantocount
não". Emborasize
realmente conte NaNs, isso é realmente uma consequência do fato de quesize
retorna o tamanho (ou o comprimento) do objeto no qual é chamado. Naturalmente, isso também inclui linhas / valores que são NaN.Portanto, para resumir,
size
retorna o tamanho do Series / DataFrame 1 ,df = pd.DataFrame({'A': ['x', 'y', np.nan, 'z']}) df A 0 x 1 y 2 NaN 3 z
df.A.size # 4
... enquanto
count
conta os valores não NaN:df.A.count() # 3
Observe que
size
é um atributo (dá o mesmo resultado quelen(df)
oulen(df.A)
).count
é uma função.1.
DataFrame.size
também é um atributo e retorna o número de elementos no DataFrame (linhas x colunas).Comportamento com
GroupBy
- Estrutura de SaídaAlém da diferença básica, há também a diferença na estrutura da saída gerada quando chamado
GroupBy.size()
vsGroupBy.count()
.df = pd.DataFrame({'A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x']}) df A B 0 a x 1 a x 2 a NaN 3 b NaN 4 b NaN 5 c NaN 6 c x 7 c x
Considerar,
df.groupby('A').size() A a 3 b 2 c 3 dtype: int64
Versus,
df.groupby('A').count() B A a 2 b 0 c 2
GroupBy.count
retorna um DataFrame quando você chamacount
em todas as colunas, enquantoGroupBy.size
retorna um Series.O motivo é que
size
é o mesmo para todas as colunas, portanto, apenas um único resultado é retornado. Enquanto isso, ocount
é chamado para cada coluna, pois os resultados dependeriam de quantos NaNs cada coluna tem.Comportamento com
pivot_table
Outro exemplo é como
pivot_table
trata esses dados. Suponha que gostaríamos de calcular a tabulação cruzada dedf A B 0 0 1 1 0 1 2 1 2 3 0 2 4 0 0 pd.crosstab(df.A, df.B) # Result we expect, but with `pivot_table`. B 0 1 2 A 0 1 2 1 1 0 0 1
Com
pivot_table
, você pode emitirsize
:df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0) B 0 1 2 A 0 1 2 1 1 0 0 1
Mas
count
não funciona; um DataFrame vazio é retornado:df.pivot_table(index='A', columns='B', aggfunc='count') Empty DataFrame Columns: [] Index: [0, 1]
Acredito que a razão para isso é que
'count'
deve ser feito na série que é passada para ovalues
argumento, e quando nada é passado, os pandas decidem não fazer suposições.fonte
Apenas para adicionar um pouco à resposta de @Edchum, mesmo que os dados não tenham valores NA, o resultado de count () é mais detalhado, usando o exemplo anterior:
grouped = df.groupby('a') grouped.count() Out[197]: b c a 0 2 2 1 1 1 2 2 3 grouped.size() Out[198]: a 0 2 1 1 2 3 dtype: int64
fonte
size
um equivalente elegante decount
nos pandas.groupby
saída é explicado aqui .Quando estamos lidando com dataframes normais, então apenas a diferença será uma inclusão de valores NAN, significa que a contagem não inclui valores NAN ao contar linhas.
Mas se estivermos usando essas funções com o
groupby
then, para obter os resultados corretoscount()
, temos que associar qualquer campo numérico aogroupby
para obter o número exato de grupos onde parasize()
não há necessidade desse tipo de associação.fonte
Além de todas as respostas acima, gostaria de apontar mais uma diferença que me parece significativa.
Você pode correlacionar o
Datarame
tamanho do Panda e contar com o do JavaVectors
tamanho e comprimento . Quando criamos o vetor, alguma memória predefinida é alocada a ele. quando chegamos mais perto do número de elementos que ele pode ocupar enquanto adicionamos elementos, mais memória é alocada para ele. Da mesma forma, emDataFrame
medida que adicionamos elementos, a memória alocada a ele aumenta.O atributo de tamanho fornece o número de células de memória alocadas,
DataFrame
enquanto a contagem fornece o número de elementos que estão realmente presentesDataFrame
. Por exemplo,Você pode ver que existem 3 linhas em
DataFrame
, seu tamanho é 6.Esta resposta cobre a diferença de tamanho e contagem em relação a
DataFrame
e nãoPandas Series
. Eu não verifiquei o que acontece comSeries
fonte