quarta-feira, 22 de julho de 2020

Operações com séries do Pandas

A linguagem python nos permite fazer operações básicas com números e objetos atraves dos operadores. Com esses operadores somos capazes de manipular objetos. Um exemplo é o operador '+', com ele podemos somar dois inteiros e receber o resultado:

>>> 3 + 7 # Soma os dois números
10

Podemos usar operadores para manipular as séries e os dataframe do Pandas. As séries e os dataframe tem suporte a muitos dos operadores da linguagem python. Quando usamos um operador com uma série ou um dataframe vamos ter como resultado uma série ou um dataframe. Nesse post vamos apresentar alguns operadores que podemos usar com séries e dataframes. Ao usar esses operadores teremos como resultado séries com valores diferentes dos seus progenitores.

Como fazer isso...

O dataset que vamos usar nos exemplos abaixo pode ser baixado aqui.
Primeiro vamos começar com um operador fácil, o operador de soma. Utilizar esse operador com uma série e um inteiro irá criar uma nova série com cada elemento da série acrescentado do número inteiro. Veja um exemplo:

>>> import pandas as pd
>>> data = pd.read_csv('data.tsv', sep='\t')
>>> classif_media = data.averageRating
>>> classif_media
0          5.7
1          6.1
2          6.5
3          6.2
4          6.1
          ...
1056047    7.2
1056048    6.6
1056049    5.9
1056050    6.9
1056051    7.3
Name: averageRating, Length: 1056052, dtype: float64
>>> classif_media + 1
0          6.7
1          7.1
2          7.5
3          7.2
4          7.1
          ...
1056047    8.2
1056048    7.6
1056049    6.9
1056050    7.9
1056051    8.3
Name: averageRating, Length: 1056052, dtype: float64

As operações de divisão, multiplicação, exponenciação e subtração seguem a mesma lógica. Veja os exemplos abaixo:

>>> classif_media / 2
0          2.85
1          3.05
2          3.25
3          3.10
4          3.05
           ...
1056047    3.60
1056048    3.30
1056049    2.95
1056050    3.45
1056051    3.65
Name: averageRating, Length: 1056052, dtype: float64
>>> classif_media * 2
0          11.4
1          12.2
2          13.0
3          12.4
4          12.2
           ...
1056047    14.4
1056048    13.2
1056049    11.8
1056050    13.8
1056051    14.6
Name: averageRating, Length: 1056052, dtype: float64
>>> classif_media ** 2
0          32.49
1          37.21
2          42.25
3          38.44
4          37.21
           ...
1056047    51.84
1056048    43.56
1056049    34.81
1056050    47.61
1056051    53.29
Name: averageRating, Length: 1056052, dtype: float64
>>> classif_media - 2
0          3.7
1          4.1
2          4.5
3          4.2
4          4.1
          ...
1056047    5.2
1056048    4.6
1056049    3.9
1056050    4.9
1056051    5.3
Name: averageRating, Length: 1056052, dtype: float64

Para fazer a divisão exata, o que vai gerar um float, use duas barras. O operador módulo também é suportado pelas séries do Pandas.

>>> classif_media // 3
0          1.0
1          2.0
2          2.0
3          2.0
4          2.0
          ...
1056047    2.0
1056048    2.0
1056049    1.0
1056050    2.0
1056051    2.0
Name: averageRating, Length: 1056052, dtype: float64
>>> classif_media % 3
0          2.7
1          0.1
2          0.5
3          0.2
4          0.1
          ...
1056047    1.2
1056048    0.6
1056049    2.9
1056050    0.9
1056051    1.3
Name: averageRating, Length: 1056052, dtype: float64

Outros operadores válidos, para serem usados com as séries do Pandas, são os de comparação (>, <, ==, >=, <=, !=). Utilizando esses operadores a saída será uma série com valores booleanos. A comparação será feita entre o valor passado e cada elemento da série. Veja um exemplo:

>>> classif_media > 6
0          False
1           True
2           True
3           True
4           True
           ...
1056047     True
1056048     True
1056049    False
1056050     True
1056051     True
Name: averageRating, Length: 1056052, dtype: bool

O valor do primeiro elemento da série é False, isso porque o primeiro elemento da série classif_media é menor ou igual a seis. O segundo é True pois o valor do segundo elemento da série classif_media é maior que seis.
Podemos usar os operadores de comparação com strings. Para esse exemplo vamos utilizar o dataset dos tutoriais passados. Veja um exemplo:

>>> filmes = pd.read_csv('filmes.csv', encoding='latin-1')
>>> diretor = filmes.Diretor
>>> diretor
0       PAULO DE TARSO DE CARVALHO MORELLI
1           WAGNER DE ASSIS E PABLO URANGA
2                LENILDO MAURICIO DA SILVA
3                              DAISY MAYER
4                            PHILLIP NOYCE
                       ...
9257                         ADAM SHANKMAN
9258         LANA WACHOWSKI ANDY WACHOWSKI
9259                        PETER CATTANEO
9260      MARIO HUMBERTO MEIRELLES MOREIRA
9261                 ANDRE BORELLI MARTINS
Name: Diretor, Length: 9262, dtype: object
>>> diretor == 'DAISY MAYER'
0       False
1       False
2       False
3        True
4       False
        ...
9257    False
9258    False
9259    False
9260    False
9261    False
Name: Diretor, Length: 9262, dtype: bool

Como funciona...

Nos exemplos acima os operadores são usados em cada elemento da série individualmente. Se fossemos fazer isso sem a biblioteca Pandas precisaríamos de um loop para cada elemento. Mas graças ao Pandas não precisamos.
Em cada um dos exemplos é retornada uma série com os mesmos índices mais com novos valores.

Tem mais...

Para cada operador existe um método que faz exatamente a mesma coisa. Veja um exemplo com a divisão:

>>> classif_media / 2
0          2.85
1          3.05
2          3.25
3          3.10
4          3.05
           ...
1056047    3.60
1056048    3.30
1056049    2.95
1056050    3.45
1056051    3.65
Name: averageRating, Length: 1056052, dtype: float64
>>> classif_media.div(2)
0          2.85
1          3.05
2          3.25
3          3.10
4          3.05
           ...
1056047    3.60
1056048    3.30
1056049    2.95
1056050    3.45
1056051    3.65
Name: averageRating, Length: 1056052, dtype: float64

Abaixo temos uma tabela com os operadores e seus métodos correspondentes:

Grupo de operadores Operadores Métodos
Aritmético + , - , * , / , // , % , ** .add , .sub , .mul , .div , .floordiv , .mod , .pow
Comparação < , > , <= , >= , == , != .lt , .gt , .le , .ge , .eq , .ne

0 comentários:

Postar um comentário