Tópico 6 – Mais consultas e GroupBy

Vamos aprender como agrupar a sumarizar dados!

Resultados Esperados

  1. Entender a função groupby
  2. Ter um pouco de noção do potêncial de pandas

Material Adaptado do DSC10 (UCSD)

Os dados de hoje estão aqui (Afonso Pena) e aqui (IMDB)

#In: 
# Descomente e execute as linhas a seguir para usar o BabyPandas e o PandasTutor
# (faça isso apenas se não tiver instalado ainda)
# ! pip install babypandas
# ! pip install pandas_tutor
#In: 
import babypandas as bpd
import numpy as np


# Estamos importando o matplotlib pela primeira vez.
# Serve para fazer gráficos
import matplotlib.pyplot as plt
plt.style.use('ggplot')
#In: 
# Esssas linhas servem para que o Pandas Tutor execute
%reload_ext pandas_tutor
%set_pandas_tutor_options {'projectorMode': True}

Hoje

  • Recapitulação: consultas.
  • Consultas com múltiplas condições.
  • Grupo por.
  • Prática extra, incluindo problemas de desafio.

Sobre os dados: Ainda estamos na feira da Afonso Pena

O DataFrame df contém dados dos feirantes da Afonso Pena

#In: 
# para rodar no colab use 'https://raw.githubusercontent.com/flaviovdf/fcd/main/assets/06-GroupBy/data/afonso_pena.csv'
# i.e., df = bpd.read_csv('https://raw.githubusercontent.com/flaviovdf/fcd/main/assets/06-GroupBy/data/afonso_pena.csv')
df = bpd.read_csv('afonso_pena.csv')

produtos = df.get('NUMERO_PRODUTOS_CADASTRADOS')
area = df.get('AREA')

df = df.assign(
    DENSIDADE= produtos / area
)
df = df.set_index('ID_FEIRA_AFONSO_PENA_BARRACA')
df
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
84G.F3.V052BARRACA CARMEN FERNANDA ROCHA DE ALCANTARACARMEN FERNANDA ROCHA DE ALCANTARAKARINA RODRIGUES BRANDORFIBijouteriasBRINCO, ANEL, PULSEIRA, COLAR, ARCO5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
87D.F2.V016BARRACA CÉLIA APARECIDA DE SOUZACÉLIA APARECIDA DE SOUZAEDSON PIRES DE SOUZAVestuárioBLUSA, BERMUDA, ROUPA DE GINÁSTICA, SAIA, VEST...7.011.8275920.591836
..............................
1350G.F4.V014BARRACA HELCIO LICIO SILVAHELCIO LICIO SILVAGRAZIELA CRISTINA RAMALHO SILVABijouteriasANEL, COLAR, BROCHE, BRINCO, PULSEIRA, ALIANÇA...7.011.8389110.591271
1351J.F1.V004BARRACA DIEGO DOS SANTOS DIASDIEGO DOS SANTOS DIASCELSO DE SOUZA LINHARESCalçadosRASTEIRINHA, SAPATO, SANDÁLIA3.011.8275920.253644
1352D.F4.V050BARRACA JAIR CORREAJAIR CORREAKeli Aparecida Batista CorreaVestuárioVESTIDO DE MALHA, BATA DE TECIDO, CONJUNTO, SA...5.011.8275920.422740
1353G.F2.V010BARRACA SIDNEY FERNANDO KNEIPP SOARESSIDNEY FERNANDO KNEIPP SOARESANA PAULA FAUSTINA DE SOUZABijouteriasCOLAR, GARGANTILHA, ARCO, ANEL, PASSADOR DE CA...7.011.8389110.591271
1354G.F1.V061BARRACA REGINA GARCIA FERREIRAREGINA GARCIA FERREIRARejane Garcia Ferreira ClementeBijouteriasCOLAR DE METAL, PRESILHA, PASSADOR DE CABELO, ...4.011.8275920.338192

1250 rows × 9 columns

Recapitulação: consultas

O que é uma consulta? 🤔

  • Uma “consulta” é um código que extrai linhas de um DataFrame para as quais determinadas condições são verdadeiras.
  • Freqüentemente usamos consultas para filtrar DataFrames para que contenham apenas as linhas que satisfaçam as condições declaradas em nossas perguntas.

Como consultamos um DataFrame?

Para selecionar apenas determinadas linhas do DataFrame df:

  1. Faça uma sequência (lista/array/Série) de Trues (manter) e Falses (jogar fora), geralmente fazendo uma comparação.
  2. Em seguida, passe-o para df[consulta].

Comparações entre elementos

Existem vários tipos de comparações que podemos fazer.

símbolosignificado
==igual a
!=diferente de
<menos que
<=menor ou igual a
>maior que
>=maior ou igual a

Exemplo 5: Qual o número de barracas de comida?

Conceito principal: consulta

Estratégia

  1. Consulta para extrair um DataFrame apenas das solicitações 'Alimentação'.
  2. Classifique por 'NUMERO_PRODUTOS_CADASTRADOS' em ordem decrescente.
  3. Extraia o primeiro elemento da coluna 'NOME_FEIRANTE'.
#In: 
comida = df[df.get('NOME_SETOR') == 'Alimentação']
comida.shape
(100, 9)

Qual o (A PESSOA) feirante que vende mais produtos de comida?

#In: 
comida = comida.sort_values(by='NUMERO_PRODUTOS_CADASTRADOS', ascending=False)
comida
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
109Y.F1.V012BARRACA DAYSE PINTO NORBERTODAYSE PINTO NORBERTODJALMA ANTÔNIO DE FREITASAlimentaçãoCERVEJA, TORRESMO, CHIPS, AZEITONA, REFRIGERAN...21.033.6110570.624794
1406Z.F1.V007BARRACA FRANCINERE AMARAL CARDOSO RIBEIRO DE S...FRANCINERE AMARAL CARDOSO RIBEIRO DE SOUZARAYKARD AGUIAR DE JESUSAlimentaçãoCERVEJA, REFRIGERANTE, SUCO INDUSTRIALIZADO, E...20.033.6110580.595042
1015X.F1.V020BARRACA VERA LUIZA DE CARVALHO MACEDOVERA LUIZA DE CARVALHO MACEDOORLANDINEIA ALVESAlimentaçãoCERVEJA, SANDUÍCHE NATURAL, BISCOITO, BOLO, RO...17.033.5959660.506013
380Y.F1.V020BARRACA MARGARET LÚCIA DA COSTA SILVAMARGARET LÚCIA DA COSTA SILVAMARIA TRINDADE DECIOLA DE JESUSAlimentaçãoACARAJÉ, BOLINHO DE CARNE DE SOL, SUCO DE AÇAÍ...16.033.5393710.477051
26Y.F2.V007BARRACA ANA CALDEIRA GOMESANA CALDEIRA GOMESPAULO HENRIQUE DE JESUS CALDEIRAAlimentaçãoCHURRASCO, PÃO DE QUEIJO, LEITE, REFRIGERANTE,...14.033.6110580.416530
..............................
1269X.F2.V013BARRACA FELIPE RODRIGUES ALVES DE DEUSFELIPE RODRIGUES ALVES DE DEUSSIDNEY ALVES DE DEUSAlimentaçãoCHURRASCO1.033.5587280.029799
1457X.F2.V011BARRACA WELLINGTON ALVES DE DEUSWELLINGTON ALVES DE DEUSSANDRO ALVES DE DEUSAlimentaçãoCHURRASCO1.033.5959660.029765
1423X.F1.V003BARRACA CELIA APARECIDA MONTEIRO CIPRIANOCELIA APARECIDA MONTEIRO CIPRIANOAPARECIDA SANTOS MONTEIROAlimentaçãoACARAJÉ1.033.6975080.029676
261X.F2.V003BARRACA JOÃO GERALDO MARTINS DE SOUZAJOÃO GERALDO MARTINS DE SOUZACHARLES DAVIDSON ROSA MARTINSAlimentaçãoCHURRASCO1.033.5690630.029789
92Y.F1.V003BARRACA CHAQUIBE HASSAN SOUKI HUNIORCHAQUIBE HASSAN SOUKI HUNIORGISMAR JOSÉ GOMESAlimentaçãoDOCE DIVERSO1.033.6059720.029757

100 rows × 9 columns

#In: 
# iloc pega a n-ésimo linha. não busca por índice, sim por linha
comida.get('NOME_FEIRANTE').iloc[0]
'DAYSE PINTO NORBERTO'

E se a condição não for satisfeita?

#In: 
df[df.get('NOME_FEIRANTE') == 'FLAVIO FIGUEIREDO']
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA

Verificação de conceito ✅

Qual expressão abaixo é avaliada como o número total de produtos infantis?

A. df[df.get('NOME_SETOR') == 'Criança'].shape

B. df[df.get('NOME_SETOR') == 'Criança'].get('NUMERO_PRODUTOS_CADASTRADOS').sum()

C.df[df.get('NOME_SETOR') != 'Criança'].get('NUMERO_PRODUTOS_CADASTRADOS').sum()

D. Mais de um dos itens acima.

Atividade 🚘

Pergunta: Quais são os produtos vendidos pelo feirante que mais vende produtos infantis?

Escreva uma linha de código que avalie a resposta.

#In: 
...
Ellipsis

Exemplo 6: Quantos feirantes vendem Vestuário Infantil e Produtos Infantis?

Conceito principal: Consultas com múltiplas condições.

Múltiplas condições

  • Para escrever uma consulta com múltiplas condições, use & para “e” e | para “ou”.
  • Você deve usar (parênteses) em torno de cada condição!
  • ⚠️ Não use as palavras-chave Python and e or aqui! Eles não se comportam como você gostaria.
  • Consulte BPD 10.3 para obter uma explicação.
#In: 
df[(df.get('NOME_SETOR') == 'Vestuário Infantil') | (df.get('NOME_SETOR') == 'Criança')]
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
88E.F3.V016BARRACA CELINA MARIA SILVA MARCELINOCELINA MARIA SILVA MARCELINOALBERTINO SERGIO MARCELINOVestuário InfantilFANTASIA, BERMUDA, CALÇA, SAIA, VESTIDO, CAMISA6.011.8275920.507288
94E.F4.V029BARRACA CLARICE CONCEIÇÃO DAS GRAÇAS DE OLIVEI...CLARICE CONCEIÇÃO DAS GRAÇAS DE OLIVEIRA LIMAANGELICA MARIA DE OLIVEIRA LIMAVestuário InfantilCONJUNTO, SHORT, CUECA, CAMISA, CAMISETA, BLUS...7.011.8389110.591271
..............................
1426F.F3.V010BARRACA ALESSANDRA DE ABREU REISALESSANDRA DE ABREU REISGLAUCIA HELENA DE ABREU TAVARESCriançaACESSÓRIOS PARA CACHORRO, ALMOFADA, CAMA DE TE...14.011.8389111.182541
1435E.F4.V006BARRACA CILDA LUZIA GUALBERTOCILDA LUZIA GUALBERTOCILMA MARIA GUALBERTO DE OLIVEIRAVestuário InfantilVESTIDO, BOLERO, CUECA, BERMUDA, SAIA, BLUSA6.011.8275920.507288
1337F.F2.V004BARRACA MATHEUS PESSALI TIAGO BARBOSAMATHEUS PESSALI TIAGO BARBOSAMIRNA COSTA GONÇALVESCriançaQUADRO, TOALHA FRALDA, TOALHA, BRINQUEDO PEDAG...6.011.8389110.506803
1342E.F1.V005BARRACA MAIRA FERNANDES DE MOURAMAIRA FERNANDES DE MOURAMAURÍCIO MARTINS TERRINHAVestuário InfantilJARDINEIRA, VESTIDO, SHORT, SAIA, BLUSA5.011.8389110.422336
1343E.F1.V033BARRACA ELIANE CORREA JANSENELIANE CORREA JANSENANDREA CORREA JANSENVestuário InfantilVESTIDO, TIARA, BLUSA, BODY, TOUCA, CALCINHA6.011.8389110.506803

224 rows × 9 columns

#In: 
# Dentro de de parênteses () ou de colchetes [] podemos quebrar a linha. ajuda na leitura
df[(df.get('NOME_SETOR') == 'Vestuário Infantil') | 
   (df.get('NOME_SETOR') == 'Criança')]
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
88E.F3.V016BARRACA CELINA MARIA SILVA MARCELINOCELINA MARIA SILVA MARCELINOALBERTINO SERGIO MARCELINOVestuário InfantilFANTASIA, BERMUDA, CALÇA, SAIA, VESTIDO, CAMISA6.011.8275920.507288
94E.F4.V029BARRACA CLARICE CONCEIÇÃO DAS GRAÇAS DE OLIVEI...CLARICE CONCEIÇÃO DAS GRAÇAS DE OLIVEIRA LIMAANGELICA MARIA DE OLIVEIRA LIMAVestuário InfantilCONJUNTO, SHORT, CUECA, CAMISA, CAMISETA, BLUS...7.011.8389110.591271
..............................
1426F.F3.V010BARRACA ALESSANDRA DE ABREU REISALESSANDRA DE ABREU REISGLAUCIA HELENA DE ABREU TAVARESCriançaACESSÓRIOS PARA CACHORRO, ALMOFADA, CAMA DE TE...14.011.8389111.182541
1435E.F4.V006BARRACA CILDA LUZIA GUALBERTOCILDA LUZIA GUALBERTOCILMA MARIA GUALBERTO DE OLIVEIRAVestuário InfantilVESTIDO, BOLERO, CUECA, BERMUDA, SAIA, BLUSA6.011.8275920.507288
1337F.F2.V004BARRACA MATHEUS PESSALI TIAGO BARBOSAMATHEUS PESSALI TIAGO BARBOSAMIRNA COSTA GONÇALVESCriançaQUADRO, TOALHA FRALDA, TOALHA, BRINQUEDO PEDAG...6.011.8389110.506803
1342E.F1.V005BARRACA MAIRA FERNANDES DE MOURAMAIRA FERNANDES DE MOURAMAURÍCIO MARTINS TERRINHAVestuário InfantilJARDINEIRA, VESTIDO, SHORT, SAIA, BLUSA5.011.8389110.422336
1343E.F1.V033BARRACA ELIANE CORREA JANSENELIANE CORREA JANSENANDREA CORREA JANSENVestuário InfantilVESTIDO, TIARA, BLUSA, BODY, TOUCA, CALCINHA6.011.8389110.506803

224 rows × 9 columns

Pergunta Original: Quantos feirante nos dois setores?

#In: 
df[(df.get('NOME_SETOR') == 'Vestuário Infantil') | 
   (df.get('NOME_SETOR') == 'Criança')].shape[0]
224
#In: 
df.get('NOME_SETOR').unique()
array(['Criança', 'Bijouterias', 'Vestuário Infantil', 'Vestuário',
       'Calçados', 'Alimentação', 'Cintos, Bolsas e Acessórios',
       'Artes e Pintura', 'Arranjos e Complementos',
       'Decoração e Utilidades', 'Cama, Mesa, Banho e Tapeçaria',
       'Mobilário, Flores, Arranjos, Cestaria', 'Esculturas'],
      dtype=object)

Verificação de conceito ✅

Cada uma das perguntas a seguir pode ser respondida consultando o DataFrame requests.

  1. Qual categoria tem mais produtos, ‘Artes e Pintura’ ou ‘Esculturas’?
  2. Quantos feirantes vendem ‘Vestuário’?
  3. Qual o nome do feirante que vende mais ‘Vestuário’?
  4. Quantas das perguntas acima exigem que a consulta tenha múltiplas condições?

Tente escrever o código para responder a cada pergunta.

#In: 
...
Ellipsis

Selecionando linhas por posição com .take

  • A consulta nos permite selecionar linhas que satisfaçam uma determinada condição.
  • Também podemos selecionar linhas em posições específicas com .take([list_of_integer_positions]). Isso mantém apenas as linhas cujas posições estão na lista especificada.
  • Isso é análogo a usar .iloc[] em uma série.
  • É raro precisar selecionar linhas por posição inteira. Consultar é muito mais útil.
#In: 
df.take([1, 3, 5])
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
84G.F3.V052BARRACA CARMEN FERNANDA ROCHA DE ALCANTARACARMEN FERNANDA ROCHA DE ALCANTARAKARINA RODRIGUES BRANDORFIBijouteriasBRINCO, ANEL, PULSEIRA, COLAR, ARCO5.011.8389110.422336
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
88E.F3.V016BARRACA CELINA MARIA SILVA MARCELINOCELINA MARIA SILVA MARCELINOALBERTINO SERGIO MARCELINOVestuário InfantilFANTASIA, BERMUDA, CALÇA, SAIA, VESTIDO, CAMISA6.011.8275920.507288
#In: 
df.take(np.arange(5))
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
84G.F3.V052BARRACA CARMEN FERNANDA ROCHA DE ALCANTARACARMEN FERNANDA ROCHA DE ALCANTARAKARINA RODRIGUES BRANDORFIBijouteriasBRINCO, ANEL, PULSEIRA, COLAR, ARCO5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
87D.F2.V016BARRACA CÉLIA APARECIDA DE SOUZACÉLIA APARECIDA DE SOUZAEDSON PIRES DE SOUZAVestuárioBLUSA, BERMUDA, ROUPA DE GINÁSTICA, SAIA, VEST...7.011.8275920.591836

Exemplo 7: Qual é área todal de cada setor?

Conceito chave: Agrupamento por uma coluna.

Organizando solicitações por bairro

  • Podemos encontrar o número total da área por setor;
  • Por exemplo, df[df.get('NOME_SETOR') == 'Criança'].get('AREA').sum().
  • Mas como podemos encontrar o total para todos os setores ao mesmo tempo?
#In: 
df[df.get('NOME_SETOR') == 'Criança'].get('AREA').sum()
1274.9974161428677
#In: 
df[df.get('NOME_SETOR') == 'Vestuário Infantil'].get('AREA').sum()
1431.87438966735

Parece que tem que haver uma maneira melhor. E aqui está!

GroupBy: dividir, agregar e combinar

Observe o que acontece quando usamos o método .groupby em requests com o argumento 'neighborhood'.

#In: 
df.groupby('NOME_SETOR').sum()
NUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
NOME_SETOR
Alimentação733.03359.34328321.820242
Arranjos e Complementos379.0615.32908832.028438
Artes e Pintura62.0713.7057312.606116
Bijouterias1047.02165.44544388.479383
Calçados774.01881.44740365.409968
............
Decoração e Utilidades423.01033.67752729.927868
Esculturas6.047.5803820.252205
Mobilário, Flores, Arranjos, Cestaria247.0771.48821414.012735
Vestuário1454.02591.442504122.878561
Vestuário Infantil788.01431.87439066.590892

13 rows × 3 columns

Observe que as contagens “totais” antes. O que acabou de acontecer? 🤯

Um exemplo ilustrativo: Animais de estimação 🐱 🐶🐹

Considere os animais de estimação do DataFrame mostrados abaixo.

#In: 
pets = bpd.DataFrame().assign(
    Species=['dog', 'cat', 'cat', 'dog', 'dog', 'hamster'],
    Color=['black', 'golden', 'black', 'white', 'golden', 'golden'],
    Weight=[40, 15, 20, 80, 25, 1],
    Age=[5, 8, 9, 2, 0.5, 3]
)
pets
SpeciesColorWeightAge
0dogblack405.0
1catgolden158.0
2catblack209.0
3dogwhite802.0
4doggolden250.5
5hamstergolden13.0

Visualizando pets.groupby('Species').mean()

  1. Divida as linhas de animais de estimação em “grupos” de acordo com seus valores na coluna 'Espécies'.
  2. Agregue as linhas com o mesmo valor de 'Species' tomando a média de todas as colunas numéricas.
  3. Combine estes meios em um novo DataFrame que é indexado por 'Species' e classificado por 'Species' em ordem crescente.

Observe que o resultado contém apenas uma linha para gatos, uma linha para cães e uma linha para hamsters!

#In: 
%%pt

pets.groupby('Species').mean()

Tutor de Pandas

  • Na última célula, vimos não apenas a saída do código, mas uma visualização do funcionamento interno do código.
  • Isso graças ao Pandas Tutor, uma nova ferramenta desenvolvida por Sam Lau, que ministrou este curso durante o verão.
  • Pandas Tutor desenha diagramas para explicar o código pandas (e babypandas).
  • Adicione %%pt ao topo de uma célula de código para explicar a última linha do código babypandas.
  • Isso requer a importação do Pandas Tutor, o que já fizemos neste notebook.
  • Você também pode usar o Pandas Tutor através de seu site, pandastutor.com.
#In: 
# Without Pandas Tutor
pets.groupby('Species').mean()
WeightAge
Species
cat17.5000008.5
dog48.3333332.5
hamster1.0000003.0
#In: 
%%pt

# With Pandas Tutor
pets.groupby('Species').mean()

Voltar para solicitações de serviço Get It Done 👷

#In: 
df
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
84G.F3.V052BARRACA CARMEN FERNANDA ROCHA DE ALCANTARACARMEN FERNANDA ROCHA DE ALCANTARAKARINA RODRIGUES BRANDORFIBijouteriasBRINCO, ANEL, PULSEIRA, COLAR, ARCO5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
87D.F2.V016BARRACA CÉLIA APARECIDA DE SOUZACÉLIA APARECIDA DE SOUZAEDSON PIRES DE SOUZAVestuárioBLUSA, BERMUDA, ROUPA DE GINÁSTICA, SAIA, VEST...7.011.8275920.591836
..............................
1350G.F4.V014BARRACA HELCIO LICIO SILVAHELCIO LICIO SILVAGRAZIELA CRISTINA RAMALHO SILVABijouteriasANEL, COLAR, BROCHE, BRINCO, PULSEIRA, ALIANÇA...7.011.8389110.591271
1351J.F1.V004BARRACA DIEGO DOS SANTOS DIASDIEGO DOS SANTOS DIASCELSO DE SOUZA LINHARESCalçadosRASTEIRINHA, SAPATO, SANDÁLIA3.011.8275920.253644
1352D.F4.V050BARRACA JAIR CORREAJAIR CORREAKeli Aparecida Batista CorreaVestuárioVESTIDO DE MALHA, BATA DE TECIDO, CONJUNTO, SA...5.011.8275920.422740
1353G.F2.V010BARRACA SIDNEY FERNANDO KNEIPP SOARESSIDNEY FERNANDO KNEIPP SOARESANA PAULA FAUSTINA DE SOUZABijouteriasCOLAR, GARGANTILHA, ARCO, ANEL, PASSADOR DE CA...7.011.8389110.591271
1354G.F1.V061BARRACA REGINA GARCIA FERREIRAREGINA GARCIA FERREIRARejane Garcia Ferreira ClementeBijouteriasCOLAR DE METAL, PRESILHA, PASSADOR DE CABELO, ...4.011.8275920.338192

1250 rows × 9 columns

#In: 
df.groupby('NOME_SETOR').sum()
NUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
NOME_SETOR
Alimentação733.03359.34328321.820242
Arranjos e Complementos379.0615.32908832.028438
Artes e Pintura62.0713.7057312.606116
Bijouterias1047.02165.44544388.479383
Calçados774.01881.44740365.409968
............
Decoração e Utilidades423.01033.67752729.927868
Esculturas6.047.5803820.252205
Mobilário, Flores, Arranjos, Cestaria247.0771.48821414.012735
Vestuário1454.02591.442504122.878561
Vestuário Infantil788.01431.87439066.590892

13 rows × 3 columns

Usando .groupby em geral

Resumindo, .groupby agrega todas as linhas com o mesmo valor em uma coluna especificada (por exemplo, 'NOME_SETOR') em uma única linha no DataFrame resultante, usando um método de agregação (por exemplo, .sum()) para combinar valores.

  1. Escolha uma coluna para agrupar.
    • .groupby(column_name) reunirá linhas que possuem o mesmo valor na coluna especificada (column_name).
    • No slide anterior agrupamos por 'NOME_SETOR'.
  2. Escolha um método de agregação.
    • O método de agregação será aplicado dentro de cada grupo.
    • No exemplo anterior, aplicamos o método .sum() a cada 'NOME_SETOR'.
    • O método de agregação é aplicado individualmente a cada coluna
    • Se não fizer sentido usar o método de agregação em uma coluna, a coluna será eliminada da saída – veremos isso com mais detalhes em breve (Tipo o nome do feirante).
    • Métodos de agregação comuns incluem .count(), .sum(), .mean(), .median(), .max() e .min().

Observação #1

  • O índice mudou para nomes de SETORES.
  • Em geral, os novos rótulos de linha são os rótulos de grupo (ou seja, os valores exclusivos na coluna em que agrupamos).
#In: 
df
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
84G.F3.V052BARRACA CARMEN FERNANDA ROCHA DE ALCANTARACARMEN FERNANDA ROCHA DE ALCANTARAKARINA RODRIGUES BRANDORFIBijouteriasBRINCO, ANEL, PULSEIRA, COLAR, ARCO5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
87D.F2.V016BARRACA CÉLIA APARECIDA DE SOUZACÉLIA APARECIDA DE SOUZAEDSON PIRES DE SOUZAVestuárioBLUSA, BERMUDA, ROUPA DE GINÁSTICA, SAIA, VEST...7.011.8275920.591836
..............................
1350G.F4.V014BARRACA HELCIO LICIO SILVAHELCIO LICIO SILVAGRAZIELA CRISTINA RAMALHO SILVABijouteriasANEL, COLAR, BROCHE, BRINCO, PULSEIRA, ALIANÇA...7.011.8389110.591271
1351J.F1.V004BARRACA DIEGO DOS SANTOS DIASDIEGO DOS SANTOS DIASCELSO DE SOUZA LINHARESCalçadosRASTEIRINHA, SAPATO, SANDÁLIA3.011.8275920.253644
1352D.F4.V050BARRACA JAIR CORREAJAIR CORREAKeli Aparecida Batista CorreaVestuárioVESTIDO DE MALHA, BATA DE TECIDO, CONJUNTO, SA...5.011.8275920.422740
1353G.F2.V010BARRACA SIDNEY FERNANDO KNEIPP SOARESSIDNEY FERNANDO KNEIPP SOARESANA PAULA FAUSTINA DE SOUZABijouteriasCOLAR, GARGANTILHA, ARCO, ANEL, PASSADOR DE CA...7.011.8389110.591271
1354G.F1.V061BARRACA REGINA GARCIA FERREIRAREGINA GARCIA FERREIRARejane Garcia Ferreira ClementeBijouteriasCOLAR DE METAL, PRESILHA, PASSADOR DE CABELO, ...4.011.8275920.338192

1250 rows × 9 columns

#In: 
df.groupby('NOME_SETOR').sum()
NUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
NOME_SETOR
Alimentação733.03359.34328321.820242
Arranjos e Complementos379.0615.32908832.028438
Artes e Pintura62.0713.7057312.606116
Bijouterias1047.02165.44544388.479383
Calçados774.01881.44740365.409968
............
Decoração e Utilidades423.01033.67752729.927868
Esculturas6.047.5803820.252205
Mobilário, Flores, Arranjos, Cestaria247.0771.48821414.012735
Vestuário1454.02591.442504122.878561
Vestuário Infantil788.01431.87439066.590892

13 rows × 3 columns

Observação #2

A coluna 'NOME_FANTASIA' e vároas outras desapareceram. Por que?

#In: 
df
CODIGO_VAGANOME_FANTASIANOME_FEIRANTENOME_PREPOSTONOME_SETORPRODUTOSNUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
ID_FEIRA_AFONSO_PENA_BARRACA
83F.F2.V016BARRACA CARMEN EMMANUEL DOS SANTOS SILVACARMEN EMMANUEL DOS SANTOS SILVAJANA FONSECA VIEIRACriançaBOLSA DE BEBÊ, MALA DE MATERNIDADE, NECESSÁIRE...5.011.8389110.422336
84G.F3.V052BARRACA CARMEN FERNANDA ROCHA DE ALCANTARACARMEN FERNANDA ROCHA DE ALCANTARAKARINA RODRIGUES BRANDORFIBijouteriasBRINCO, ANEL, PULSEIRA, COLAR, ARCO5.011.8389110.422336
85E.F4.V003BARRACA CARMEN LÚCIA CARVALHO DE ALMEIDACARMEN LÚCIA CARVALHO DE ALMEIDABARBARA ISABELLE CARVALHO DE PAULAVestuário InfantilVESTIDO, CONJUNTO, MACACÃO3.011.8389110.253402
86E.F2.V004BARRACA CECÍLIA PAGANO NEVES SALAZARCECÍLIA PAGANO NEVES SALAZARGISELE PAGANO NEVES SALAZARVestuário InfantilMACACÃO, BLUSA, SAPATINHO3.011.8275920.253644
87D.F2.V016BARRACA CÉLIA APARECIDA DE SOUZACÉLIA APARECIDA DE SOUZAEDSON PIRES DE SOUZAVestuárioBLUSA, BERMUDA, ROUPA DE GINÁSTICA, SAIA, VEST...7.011.8275920.591836
..............................
1350G.F4.V014BARRACA HELCIO LICIO SILVAHELCIO LICIO SILVAGRAZIELA CRISTINA RAMALHO SILVABijouteriasANEL, COLAR, BROCHE, BRINCO, PULSEIRA, ALIANÇA...7.011.8389110.591271
1351J.F1.V004BARRACA DIEGO DOS SANTOS DIASDIEGO DOS SANTOS DIASCELSO DE SOUZA LINHARESCalçadosRASTEIRINHA, SAPATO, SANDÁLIA3.011.8275920.253644
1352D.F4.V050BARRACA JAIR CORREAJAIR CORREAKeli Aparecida Batista CorreaVestuárioVESTIDO DE MALHA, BATA DE TECIDO, CONJUNTO, SA...5.011.8275920.422740
1353G.F2.V010BARRACA SIDNEY FERNANDO KNEIPP SOARESSIDNEY FERNANDO KNEIPP SOARESANA PAULA FAUSTINA DE SOUZABijouteriasCOLAR, GARGANTILHA, ARCO, ANEL, PASSADOR DE CA...7.011.8389110.591271
1354G.F1.V061BARRACA REGINA GARCIA FERREIRAREGINA GARCIA FERREIRARejane Garcia Ferreira ClementeBijouteriasCOLAR DE METAL, PRESILHA, PASSADOR DE CABELO, ...4.011.8275920.338192

1250 rows × 9 columns

#In: 
df.groupby('NOME_SETOR').sum()
NUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
NOME_SETOR
Alimentação733.03359.34328321.820242
Arranjos e Complementos379.0615.32908832.028438
Artes e Pintura62.0713.7057312.606116
Bijouterias1047.02165.44544388.479383
Calçados774.01881.44740365.409968
............
Decoração e Utilidades423.01033.67752729.927868
Esculturas6.047.5803820.252205
Mobilário, Flores, Arranjos, Cestaria247.0771.48821414.012735
Vestuário1454.02591.442504122.878561
Vestuário Infantil788.01431.87439066.590892

13 rows × 3 columns

Colunas desaparecendo ✨🐇🎩

  • O método de agregação – .sum(), neste caso – é aplicado a cada coluna.
  • Se não fizer sentido aplicá-lo a uma determinada coluna, essa coluna desaparecerá.
  • Por exemplo, não podemos somar strings, como na coluna 'NOME_FANTASIA'.

Observação #3

  • O método de agregação é aplicado a cada coluna separadamente.
  • As linhas do DataFrame resultante precisam ser interpretadas com cuidado.
#In: 
df.groupby('NOME_SETOR').mean()
NUMERO_PRODUTOS_CADASTRADOSAREADENSIDADE
NOME_SETOR
Alimentação7.33000033.5934330.218202
Arranjos e Complementos7.28846211.8332520.615931
Artes e Pintura2.06666723.7901910.086871
Bijouterias5.72131111.8330350.483494
Calçados4.86792511.8330030.411383
............
Decoração e Utilidades6.13043514.9808340.433737
Esculturas3.00000023.7901910.126102
Mobilário, Flores, Arranjos, Cestaria5.88095218.3687670.333637
Vestuário6.63926911.8330710.561089
Vestuário Infantil6.51239711.8336730.550338

13 rows × 3 columns

Duas escolhas a serem feitas ao usar .groupby

Como encontramos o número de diferentes serviços solicitados em cada bairro?

Duas opções:

  1. Por qual coluna devemos agrupar?
  2. Que método de agregação devemos usar?
    • Alguns mais comuns são .count(), .sum(), .mean(), .median(), .max() e .min().
#In: 
...
Ellipsis

Observação #4

  • Para contar a quantidade de elementos por grupo use o .size()
#In: 
num_barracas = df.groupby('NOME_SETOR').size()
num_barracas
NOME_SETOR
Alimentação                              100
Arranjos e Complementos                   52
Artes e Pintura                           30
Bijouterias                              183
Calçados                                 159
                                        ... 
Decoração e Utilidades                    69
Esculturas                                 2
Mobilário, Flores, Arranjos, Cestaria     42
Vestuário                                219
Vestuário Infantil                       121
Length: 13, dtype: int64

Mais prática: conjunto de dados IMDb 🎞️

  • Os dados estão aqui

#In: 
# No colab, use este caminho 'https://raw.githubusercontent.com/flaviovdf/fcd/main/assets/06-GroupBy/data/imdb.csv'
imdb = bpd.read_csv('imdb.csv').set_index('Title').sort_values(by='Rating')
imdb
VotesRatingYearDecade
Title
Akira916528.019881980
Per un pugno di dollari1246718.019641960
Guardians of the Galaxy5273498.020142010
The Man Who Shot Liberty Valance491358.019621960
Underground394478.019951990
...............
Schindler's List7612248.919931990
12 Angry Men3841878.919571950
The Godfather: Part II6927539.019741970
The Shawshank Redemption14987339.219941990
The Godfather10273989.219721970

250 rows × 4 columns

Pergunta: Quantos filmes aparecem em cada década?

#In: 
imdb.groupby('Decade').count()
VotesRatingYear
Decade
1920444
1930777
1940141414
1950303030
1960222222
1970212121
1980313131
1990424242
2000505050
2010292929
#In: 
# We'll learn how to make plots like this in the next lecture!
imdb.groupby('Decade').count().plot(y='Year');

png

Pergunta: Qual foi o filme de maior audiência da década de 1990?

Vamos tentar fazer isso de duas maneiras diferentes.

Sem agrupamento

#In: 
%%pt
imdb[imdb.get('Decade') == 1990].sort_values('Rating', ascending=False).index[0]

Nota: O comando para extrair o índice de um DataFrame é .index - sem parênteses! Isso é diferente da maneira como extraímos colunas, com .get(), porque o índice não é uma coluna.

Com agrupamento

#In: 
%%pt
imdb.reset_index().groupby('Decade').max()
  • Acontece que este método não produz a resposta correta.
  • Quando usamos um método de agregação (por exemplo, .max()), a agregação é feita para cada coluna individualmente.
  • Embora seja verdade que o filme com maior audiência da década de 1990 tem uma classificação de 9,2, esse filme não Imperdoável – em vez disso, Imperdoável é o filme mais recente no alfabeto entre todos os filmes da década de 1990.
  • Usar o max não ajuda aqui.

Problemas de desafio

Não abordaremos esses problemas em aula, mas eles estão aqui para você praticar com alguns exemplos mais difíceis. Para acessar as soluções, você precisará assistir this solution walkthrough video (início às 10h).

Antes de assistir ao vídeo, tente resolver esses problemas por conta própria – eles são uma ótima preparação para trabalhos de casa, projetos e exames!

Pergunta: Há quantos anos mais de 3 filmes foram classificados acima de 8,5?

#In: 

Além: Usando .sum() em um array/série booleana

  • A soma de um array/série booleana fornece uma contagem do número de elementos True. Isso ocorre porque Python trata True como 1 e False como 0.
  • Você pode usar esse fato aqui?
#In: 

Pergunta: Dos anos com mais de 3 filmes, qual teve a classificação média mais alta?

#In: 

Pergunta: Qual ano teve os títulos de filmes mais longos, em média?

Dica: Use .str.len() na coluna ou índice que contém os nomes dos filmes.

#In: 

Pergunta: Qual é a classificação média dos filmes dos anos que tiveram pelo menos 3 filmes no Top 250?

#In: 

Resumo, da próxima vez

Resumo

  • Podemos escrever consultas que envolvam múltiplas condições, desde que:
  • Coloque parênteses em todas as condições.
  • Separe as condições usando & se você precisar que todas sejam verdadeiras, ou | se você precisar que pelo menos uma seja verdadeira.
  • A chamada de método df.groupby(column_name).agg_method() agrega todas as linhas com o mesmo valor para column_name em uma única linha no DataFrame resultante, usando agg_method() para combinar valores.
  • Métodos de agregação a serem conhecidos: .count(), .sum(), .mean(), .median(), .max() e .min().

Próxima vez

Uma imagem vale mais que 1000 palavras – é hora de visualizar!