Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

df.value_counts() ou df.groupby([' ']).count?

No exercício usamos o df.groupby([' ']).count, seria possível usar odf.value_counts() neste caso? Qual a diferença entre os dois?

No Stack achei essa explicação mas não consegui entender o retorno no print (df.groupby('colA').count())https://stackoverflow.com/questions/47487753/when-is-it-appropriate-to-use-df-value-counts-vs-df-groupby-count

7 respostas

Oi, Marcel! Tudo bem com você? Espero que sim!

São dois métodos bem semelhantes mesmo, mas existem alguns detalhes particulares que os fazem ser diferentes. Para facilitar seu entendimento vou utilizar um DataFrame um pouco menor que o do exemplo que você deixou aqui do StackOverflow, beleza?

Montei o DataFrame df da seguinte forma:

df = pd.DataFrame({'A':['ana','barbara','cassia','ana','ana','cassia'],
                  'B':['ana','cassia','cassia','barbara','cassia',np.nan],
                  'C':['cassia','cassia',np.nan,'barbara',np.nan,'barbara']})

Resultando no seguinte conjunto:

ABC
0anaanacassia
1barbaracassiacassia
2cassiacassianan
3anabarbarabarbara
4anacassianan
5cassiananbarbara

De início, vamos analisar apenas a coluna 'A'. Ao utilizar o método value_counts() na coluna A por meio de df['A'].value_counts() teremos o seguinte retorno:

ana3
cassia2
barbara1

Notamos então que o value_counts() calcula a quantidade de cada elemento e os apresenta ordenados por quantidade de frequência, como foi o exemplo dos elementos da coluna A. Se aplicarmos esse mesmo método à outra coluna, o tipo de ordenação será o mesmo.

Já o método groupby é um pouco diferente na sua forma de classificação, pois esse método tem como função agrupar o DataFrame por características de determinada(s) coluna(s) e apresentá-las. Para utilizar esse método é preciso definir a coluna com as características que serão agrupadas e a como elas serão agrupadas, nisso podemos escolher se será por média, soma, quantidade e outras opções que você pode ver através da documentação.

Acontece que ao utilizar o método count() em groupby, será retornado a quantidade de vezes que os elementos da coluna definida se referenciou às demais, em outras palavras, é retornada a quantidade de vezes que os elementos de uma definida coluna estiveram na mesma linha dos elementos (diferentes de NaN) das outras colunas. Como um exemplo, ao agruparmos a coluna A de df por frequência de elementos por meio de df.groupby('A').count() temos o seguinte retorno:

BC
ana32
barbara11
cassia11

Se olharmos com mais atenção ao DataFrame df, veremos que foi contado quantas linhas de B e C os elementos de A apareceram ignorando a contagem dos valores NaN. Comparando a coluna A com a B, vemos que a os valores de B não são tão relevantes para esse método, exceto nos casos NaN:

Alt text: colunas A e B do DataFrame df, os elementos das linhas 0, 3 e 4 são destacados com um retângulo de contorno verde sem preenchimento em cada linha, ao lado esquerdo desses retângulos têm as frases: “1° linha com ‘ana’ em A”, “2° linha com ‘ana’ em A” e “3° linha com ‘ana’ em A” em ordem das linhas. Os elementos da linha 1 são destacados com um retângulo de contorno azul sem preenchimento, ao lado esquerdo dele tem a frase “Única linha com ’barbara’ em A”. Os elementos da linha 2 são destacados com um retângulo de contorno roxo sem preenchimento, ao lado esquerdo dele tem a frase “1° linha com ’cassia’ em A”.

Se você fizer a mesma comparação com a coluna C, você verá que 'ana' terá apenas 2 casos porque existe um valor NaN na mesma linha de um dos elementos 'ana' da coluna A.

Como a coluna A tem os mesmo elementos que ela mesma, utilizar o comando df.groupby('A')['A'].count() retornará a quantidade de elementos na coluna A.

Na atividade do curso é verificado a frequência de valores válidos em 'Valor' por meio da coluna 'Tipos', bem como foi feito na comparação entre as colunas A e B e A e C. Por conta disso, utilizar df.value_counts() não seria tão interessante se a quantidade de valores válidos em ‘Tipos’ seja diferente da coluna ‘Valor’ e assim gerar um erro no gráfico ou em alguma outra análise que pode ser realizada, mas se o DataFrame não apresentar esse problema, é possível utilizar df.value_counts() sem problemas. Além disso, acredito que o instrutor buscou aplicar na atividade o conteúdo passado na aula anterior, por isso optou por utilizar df.groupby(). ;-)

Eu espero ter te ajudado! Se surgir outra dúvida estarei à disposição.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Mirla, desculpa a demora, tem sido um post que tenho lido e relido faz um tempo. Eu confesso que fiquei mais confuso, na minha cabeça eu imaginava que o que groupby() fazia era algo mais ou menos do tipo: Quando vc agrupava por A (no seu exemplo), era como se ele temporariamente transformasse A no índice e aplicasse a função desejada no "novo DataFrame" mas pelo seu exemplo já "bugou" minha cabeça porque não há 03 anas em B. Não entendi a finalidade de groupby() ainda, fiquei com a sensação de que o groupby() "transforma" A em index (no exemplo) e utiliza as outras colunas apenas para verificar onde há Nan para não contar a linha correspondente em A, e o retorno das demais colunas B e C recebem quantas vezes os nomes de A aparece retirando os NaNs, é isso?

Oi, Marcel!

O groupby é um método um pouco mais utilizado em DataFrames que possuem números, por conta disso pode ser um pouco mais difícil de entender quando aplicamos a texto apenas, então não se preocupe que eu estou aqui para te ajudar.

A função do groupby é agrupar o DataFrame de acordo com os elementos de uma coluna especificada, ou seja, ele une todos os dados referentes aos elementos únicos de uma coluna qualquer definida no método. Não é que ele transforma os dados em índices, na verdade ele trabalha com os dados referentes aos elementos da coluna especificada e os apresenta de forma categórica. Por exemplo, se tivermos um DataFrame com as notas de prova 2 alunos como esse:

AlunosNotas
0Mauricio7
1Lucas10
2Mauricio8
3Lucas3
4Mauricio5
5Lucas10

E com ele precisamos definir qual a média dos dois alunos. Para isso, podemos utilizar o groupby() e o mean() para categorizar as notas do Lucas e do Maurício e conseguir o resultado por média.

df.groupby('Alunos')['Notas'].mean()

O método groupby, nesse caso, irá verificar quais são os elementos únicos da coluna Alunos (no caso será Lucas e Maurico) e irá analisar todas as linhas que eles estão para coletar os dados referentes à eles e o mean irá aplicá-los no cálculo da média. Assim, pelo exemplo, ele irá coletar todas as notas do Lucas e do Mauricio separadamente e calcular a média com os dados de cada um, o resultado será o seguinte:

AlunosNotas
Lucas7.66667
Mauricio6.66667

Ou seja, o groupby só fez a função de coletar os dados de cada aluno, e o mean() definiu que seria feita a média desses dados.

Para falarmos sobre o .count(), imagine o caso de que em uma outra turma vai ser preciso verificar quantas provas foram feitas por cada aluno, esses são os dados que temos:

AlunosNotas
0Beatriz5
1Maria10
2Beatriznan
3Maria7
4Beatriz4
5Maria10

Já olhando por cima, sabemos que Beatriz não participou de uma das provas, e Maria participou de todas as 3. Então, como poderíamos fazer o programa contar quantas provas fez Maria e Beatriz? A resposta é através do groupby() e do count():

df2.groupby('Alunos')['Notas'].count()

Aqui o groupby vai coletar os dados de Maria e Beatriz e o count() vai contar quantos dados têm, ignorando os valores NaN. Como estamos pedindo a contagem pela coluna Notas, será retornado quantas vezes aparecem as notas de cada aluna. Assim o resultado será o seguinte:

AlunosNotas
Beatriz2
Maria3

Se fosse utilizada a especificação da própria coluna de Alunos como dessa forma:

df2.groupby('Alunos')['Alunos'].count()

O groupby, novamente, coletaria os dados de Maria e Beatriz e o count() contaria quantos dados têm, ignorando os valores NaN. Como não existem valores NaN na coluna Alunos, o resultado será a quantidade de valores de cada elemento da coluna Alunos.

O exemplo das colunas A, B e C leva essa mesma ideia. O groupby coletou os dados de cada elemento único de A e o count() contou quantas amostras diferentes de NaN aparecem nas colunas B e C.

Espero que agora tenha ficado mais claro para você, mas se ainda sentir alguma dificuldade peço que, por favor, comunique aqui para que eu possa te ajudar da melhor forma possível a sanar a dúvida. O gropby() é um método muito importante em ciência de dados e entender ele é essencial ;-)

Bons estudos!

Oi Mirla eu acho que entendi... Na sua primeira explicação utilizando o dataset com string apenas o que ocorre é que: O groupby agrupa pela coluna "A" ; Ao identificar os elementos únicos de "A" (ana, barbara, cassia) ele organiza esses elementos como "guias"; Utilizando como guias ao ler a coluna "B" ou "C" realizando a operação de contagem count(), então cada célula correspondente as linhas do agrupamento "Ana", por exemplo, que não possuir Nan, será contado como um (independente do que está escrito na coluna "B" se for Ana, Cassia ou Bárbara), como na sua segunda explicação são números ele e a operação é mean() ele utiliza o valor da célula da coluna "Notas". É isso?

solução!

Oi Marcel!

Isso aí, perfeito! Se você tiver mais alguma dúvida pode avisar aqui que estarei à disposição.

Bons estudos!

Obrigado Mirla Borges!! Feliz Natal e Feliz Ano Novo!! Muita paz, saúde, alegria e festas para vc :)

Eu que agradeço, fico muito feliz que tenha entendido!

Um feliz natal e próspero ano novo para você também! Boas festas! ^^