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

Selecionar Multiplas Strings com groupby

Boa tarde!

Estou trabalhando com um DataFrame do TSE que conta com inúmeras informações sobre os candidatos. Segue aqui um exemplo fictício:

import pandas as pd

df = pd.DataFrame({'Nome': ['Carlos', 'José', 'Maria', 'Gilberto', 'Fulano', 'Ciclano', 'Beltrano', 'Parrot', 'Falcon', 'Alexa', 'André', 'Melissa', 'Roberto', 'Maria', 'Pedro'],
                   'Profissão': ['POLICIAL MILITAR', 'MOTORISTA', 'PRESIDENTE', 'POLICIAL CIVIL', 'MILITAR DA RESERVA', 'POLICIAL MILITAR', 'AMBULANTE', 'POLICIAL CIVIL', 'POLICIAL CIVIL', 'MÉDICO', 'MILITAR DA RESERVA', 'CAMINHONEIRO', 'POLICIAL CIVIL', 'MILITAR DA RESERVA', 'POLICIAL CIVIL'],
                   'Partido': ['A', 'B', 'A', 'C', 'D', 'B', 'A', 'C', 'A', 'B', 'D', 'D', 'C', 'A', 'B']})

Isso retorna o seguinte DataFrame:


Nome    Profissão    Partido
0    Carlos    POLICIAL MILITAR    A
1    José    MOTORISTA    B
2    Maria    PRESIDENTE    A
3    Gilberto    POLICIAL CIVIL    C
4    Fulano    MILITAR DA RESERVA    D
5    Ciclano    POLICIAL MILITAR    B
6    Beltrano    AMBULANTE    A
7    Parrot    POLICIAL CIVIL    C
8    Falcon    POLICIAL CIVIL    A
9    Alexa    MÉDICO    B
10    André    MILITAR DA RESERVA    D
11    Melissa    CAMINHONEIRO    D
12    Roberto    POLICIAL CIVIL    C
13    Maria    MILITAR DA RESERVA    A
14    Pedro    POLICIAL CIVIL    B

Eu gostaria de saber o numero de profissões dos candidatos por partido. Consegui tranquilamente usando o group.by:

por_partido = df.groupby('Partido') por_partido['Profissão'].value_counts()

Retornado:

Partido  Profissão         
A        AMBULANTE             1
         MILITAR DA RESERVA    1
         POLICIAL CIVIL        1
         POLICIAL MILITAR      1
         PRESIDENTE            1
B        MOTORISTA             1
         MÉDICO                1
         POLICIAL CIVIL        1
         POLICIAL MILITAR      1
C        POLICIAL CIVIL        3
D        MILITAR DA RESERVA    2
         CAMINHONEIRO          1
Name: Profissão, dtype: int64

Meu problema é que desejo selecionar apenas algumas profissões e que ele me retornasse a soma por partido. Por exemplo: Quero saber a soma de "POLICIAL CIVIL, POLICIAL MILITAR e MILITAR DA RESERVA' por partido. Quando tento criar um novo DataFrame apenas com essas profissões e então usar o groupby, me retorna erro.

Alguém tem alguma ideia de como posso resolver isso?

PS1: Na minha Base de Dados real, existe mais de uma centena de profissões. PS2: Perdão se a formatação do post não ficou boa, é o primeiro post do tipo que faço.

Obrigado!

5 respostas
solução!

Olá Rodrigo, tudo bem ? Espero que sim.

A ideia que tive foi criar um novo DataFrame filtrando pelas profissões que queremos, utilizei o query:

profissoes = ["POLICIAL CIVIL", "POLICIAL MILITAR", "MILITAR DA RESERVA"]
df_filtrado = df.query('Profissão == @profissoes')

(para acessar uma variável na query incluímos um @ antes do nome da variável)

Depois segui com o seu código apenas mudando para o novo DataFrame:

por_partido = df_filtrado.groupby('Partido')
por_partido['Profissão'].value_counts()

Veja se isso soluciona seu questionamento.

Bons Estudos, abraço.

Olá Rodrigo, tudo certo por aí??

Começarei com uma sugestão para esse filtro de profissões.

Conhece o .unique aqui tem a documentação referente, com ele você irá trazer apenas valores únicos e assim evitar a repetição que vemos aqui:

Partido  Profissão         
A        AMBULANTE             1
         MILITAR DA RESERVA    1
         POLICIAL CIVIL        1
         POLICIAL MILITAR      1
         PRESIDENTE            1
B        MOTORISTA             1
         MÉDICO                1
         POLICIAL CIVIL        1
         POLICIAL MILITAR      1
C        POLICIAL CIVIL        3
D        MILITAR DA RESERVA    2
         CAMINHONEIRO          1
Name: Profissão, dtype: int64

Você pode usar assim:

por_partido = df.groupby('Partido') 
por_partido['Profissão'].unique()

Agora uma sugestão para resolução da sua dúvida você consegue transformar "por_partido" em um DataFrame usando a seguinte sintaxe:

profissoes_partido = pd.DataFrame(por_partido)
profissoes_partido

Daí agora você consegue manipular da forma que preferir =)

Espero ter te ajudado e qualquer dúvida é só retornar aqui!

Bons estudos Rodrigo!

Obrigado pelas respostas, pessoal!

Victor, sua abordagem foi útil para ver quais quais as profissões presentem em cada partido. Uma análise útil também.

Igor, sua abordagem foi bem em linha o que eu esperava! Se possível, preciso de mais uma etapa.

Fiz exatamente como você colocou e me retornou o seguinte:

X              POLICIAL MILITAR             134
               MILITAR REFORMADO             46
               MEMBRO DAS FORÇAS ARMADAS      6
Y              POLICIAL MILITAR              98
               MILITAR REFORMADO             56
Z              POLICIAL MILITAR              56
               MILITAR REFORMADO             26
               MEMBRO DAS FORÇAS ARMADAS      2
W              POLICIAL MILITAR             190
               MILITAR REFORMADO             86
               MEMBRO DAS FORÇAS ARMADAS      9

(No caso eu usei aqui a base de dados real e ocultei o nome real dos partidos).

Eu gostaria de saber a soma dessas 3 profissões por partido e não apenas o numero de candidatos dessas profissões por partido, como ai está. Poderia me ajudar nisso?

Grato mais uma vez a ambos!

Olá Rodrigo.

Basta rodar o método count:

por_partido = df_filtrado.groupby('Partido')
por_partido.count()

Bons Estudos, abraço.

Obrigado!