quarta-feira, 5 de agosto de 2020

Operações com dataframes pandas

Imagem de Steve Buissinne por Pixabay

Quando usamos um operador de comparação ou aritmético num dataframe pandas, a operação é feita com todos os elementos. A grande maioria das operações sobre os dataframe envolvem colunas numéricas, mas é comum encontramos com strings. Um cuidado que deve ser tomado é quanto ao tipo dos dados, se os dados não forem homogêneos a operação vai falhar. No exemplo abaixo vamos ver esse erro com o dataset filmes. Nesse dataset os dados não são homogêneos, existem dados do tipo int64, float64 e object. Por isso quando tentamos adicionar o valor inteiro 5, geramos um erro. Porque um número inteiro não pode ser adicionado a uma string, sem antes converter o número para uma string.

>>> import pandas as pd
>>> filmes = pd.read_csv('filmes.csv')
>>> filmes + 5
Traceback (most recent call last):
  ...
TypeError: can only concatenate str (not "int") to str

Uma condição para utilizar com êxito um operador com um dataframe é selecionar dados homogêneos. Para esse tutorial vamos selecionar as colunas do tipo inteiro usando o método filter().

>>> import pandas as pd
>>> filmes = pd.read_csv('filmes.csv')
>>> filmes_int = filmes.filter(items=['indice', 'codigo_obra'])
>>> filmes_int.head()
   indice  codigo_obra
0       0        15639
1       1         7603
2       2        26453
3       3        17284
4       4         4806

O parâmetro like, do método filter(), é muito utilizado para selecionar coluna, isso porque não precisamos passar o nome exato da coluna para o parâmetro. Utilizando esse parâmetro podemos selecionar várias colunas com uma sequencia de strings. Por exemplo, nesse dataset existem duas colunas que tem a string 'titulo' no seu nome. Para selecionar essas duas colunas é só passar a string 'titulo' para o parâmetro like. Veja um exemplo:

>>> filmes.filter(like='titulo')
                  titulo_original                titulo_brasil
0                  PREÇO DA PAZ O               PREÇO DA PAZ O
1                     CARTOMANTEA                  CARTOMANTEA
2            BLACK & WHITE VOL. 9         BLACK & WHITE VOL. 9
3                        THE GURU               O GURU DO SEXO
4                  QUIET AMERICAN        O AMERICANO TRANQUILO
...                           ...                          ...
9257                 ROCK OF AGES        ROCK OF AGES: O FILME
9258                   THE MATRIX                       MATRIX
9259               MILITARY WIVES               MILITARY WIVES
9260  ROBERTO CARLOS EM JERUSALÉM  ROBERTO CARLOS EM JERUSALÉM
9261                       O POÇO                       O POÇO

[9262 rows x 2 columns]

Como fazer operações com dataframes pandas

Agora que já selecionamos os dados de forma homogênea, realizar operações é fácil como somar um mais um. Veja o exemplo:

>>> filmes_int * 2
      indice  codigo_obra
0          0        31278
1          2        15206
2          4        52906
3          6        34568
4          8         9612
...      ...          ...
9257   18514     32003588
9258   18516     30001932
9259   18518     38005368
9260   18520      1219524
9261   18522     38010274

Nesse exemplo cada elemento do dataframe filmes_int foi multiplicado por dois. Podemos realizar todas as principais operações com um dataframe pandas, como soma, divisão, etc. No exemplo acima todos os elementos foram multiplicados por dois, mas se quiséssemos que cada elemento fosse somado com um valor diferente? Utilizaríamos outro dataframe.

>>> filmes_int + filmes.filter(items=['indice', 'codigo_obra'])
      indice  codigo_obra
0          0        31278
1          2        15206
2          4        52906
3          6        34568
4          8         9612
...      ...          ...
9257   18514     32003588
9258   18516     30001932
9259   18518     38005368
9260   18520      1219524
9261   18522     38010274

[9262 rows x 2 columns]

Nesse exemplo cada elemento do dataframe filmes_int é somado com o elemento correspondente no dataframe gerado pelo método filter(). Assim linha é somada com linha e coluna com coluna.

0 comentários:

Postar um comentário