Pandas Groupby
February 01, 2021
Diversas vezes quando você vai fazer análise de um conjunto grande de dados é preciso agregar esses dados para que eles façam mais sentido e possam ser mais facilmente analisados.
Sempre que tenho a necessidade de organizar dados eu recorro ao groupby do Pandas.
O método groupby não só faz uma agregação dos dados, mas também te dá a possibilidade de extrair umas estatísticas bem interessantes.
Vamos dar uma olhada nesses dados de títulos na Netflix:
>>> import pandas as pd>>> df = pd.read_csv("netflix_titles.csv")>>> colunas = ['title', 'country', 'release_year']>>> titulos = df.filter(items=colunas)>>> titulos.head(10)title country release_year0 3% Brazil 20201 7:19 Mexico 20162 23:59 Singapore 20113 9 United States 20094 21 United States 20085 46 Turkey 20166 122 Egypt 20197 187 United States 19978 706 India 20199 1920 India 2008
Será que dá pra saber quantos títulos de cada país existem?
Pra isso eu preciso contar quantas vezes o nome de um país aparece nessa tabela. É aqui que o groupby começa a ser útil.
Eu quero então agrupar as linhas de acordo com a coluna “country”. Quando o método groupby é executado, ele cria um objeto também chamado Groupby, que possui diversos outros métodos.
Nesse exemplo, vou usar o count()
pra fazer a contagem de vezes que um país aparece na tabela. Além disso, quero que a agregação seja feita na coluna “title”. Então o código fica assim:
>>> titulos.groupby(['country'])['title'].count()countryArgentina 50Argentina, Brazil, France, Poland, Germany, Denmark 1Argentina, Chile 1Argentina, Chile, Peru 1Argentina, France 1..Venezuela 1Venezuela, Colombia 1Vietnam 5West Germany 1Zimbabwe 1Name: title, Length: 681, dtype: int64
A visualização ainda não está perfeita, mas já dá pra perceber que houve uma contagem de títulos por país.
Quero agora melhorar a visualização e ordenar pelo país com mais títulos primeiro:
>>> grouped_titulos = titulos.groupby(['country'])['title'].count().reset_index()>>> grouped_titulos.sort_values('title', ascending=False).head(10)country title549 United States 2555229 India 923462 United Kingdom 397291 Japan 226394 South Korea 18351 Canada 177403 Spain 134147 France 115137 Egypt 101308 Mexico 100
O groupby
também aceita o agrupamento por mais de uma coluna. Vamos supor que eu quero saber quantos títulos foram lançados em cada ano, pelo mesmo país:
>>> group_titulos = titulos.groupby(['country', 'release_year']).count().reset_index()>>> group_titulos.sort_values('title', ascending=False).head()country release_year title1330 United States 2019 3591328 United States 2017 3511329 United States 2018 3481331 United States 2020 3321327 United States 2016 254
O objetivo aqui era dar uma breve introdução ao groupby e um pouco do que pode ser feito com essa função.
Existem outras funções do objeto Groupby bastante úteis também e que podem ser encontradas na documentação do Pandas.
No futuro, em outro post posso detalhar melhor essas outras funções aplicadas a conjuntos de dados diferentes.