terça-feira, 8 de dezembro de 2020

Python - Pandas DataFrame.fillna() para substituir valores nulos no dataframe

Python é uma ótima linguagem para fazer análise de dados, principalmente por causa do fantástico ecossistema de pacotes Python centrados em dados. Pandas é um desses pacotes e torna a importação e análise de dados muito mais fácil.

Às vezes, o arquivo csv tem valores nulos, que são exibidos posteriormente como NaN no quadro de dados. Assim como o método pandas dropna() gerencia e remove valores nulos de um quadro de dados, fillna() gerencia e permite que o usuário substitua os valores NaN por algum valor próprio.

Sintaxe:

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

Parâmetros:

value: estático, dicionário, matriz, série ou dataframe a ser preenchido em vez de NaN.
method: method é usado se o usuário não passar nenhum valor. O Pandas tem métodos diferentes como bfill, backfill ou ffill, que preenche o local com o valor do próximo índice ou do anterior, respectivamente.
axis: o axis leva o valor int ou string para linhas/colunas. A entrada pode ser 0 ou 1 para Inteiro e 'index' ou 'columns' para String.
inplace: É um booleano que faz as alterações no próprio quadro de dados se True.
limit: Este é um valor inteiro que especifica o número máximo de preenchimentos consecutivos de valores NaN.
downcast: É necessário um dict que especifica qual tipo fazer o downcast. Como Float64 para int64.
** kwargs: qualquer outro argumento de palavra-chave.

Para obter o link para o arquivo CSV usado no código, clique aqui.

Exemplo #1: Substituindo valores NaN por um valor estático.

Antes de substituir:

# importando modelo pandas
import pandas as pd

# criando um dataframe apartir de um arquivo csv
nba = pd.read_csv("nba.csv")
print(nba)

Resultado:

              Name            Team  Number Position   Age Height  Weight            College     Salary
0    Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0
1      Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0
2     John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN
3      R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.0
4    Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN  5000000.0
..             ...             ...     ...      ...   ...    ...     ...                ...        ...
453   Shelvin Mack       Utah Jazz     8.0       PG  26.0    6-3   203.0             Butler  2433333.0
454      Raul Neto       Utah Jazz    25.0       PG  24.0    6-1   179.0                NaN   900000.0
455   Tibor Pleiss       Utah Jazz    21.0        C  26.0    7-3   256.0                NaN  2900000.0
456    Jeff Withey       Utah Jazz    24.0        C  26.0    7-0   231.0             Kansas   947276.0
457            NaN             NaN     NaN      NaN   NaN    NaN     NaN                NaN        NaN

[458 rows x 9 columns]

Depois de substituir: No exemplo a seguir, todos os valores nulos na coluna College foram substituídos pela string “No college”. Em primeiro lugar, o quadro de dados é importado de CSV e, em seguida, a coluna College é selecionada e o método fillna() é usado nela.

import pandas as pd

nba = pd.read_csv("nba.csv")

# substitui os valores nulos da coluna 'College'
# por 'No College'
nba["College"].fillna("No College", inplace=True)
print(nba)

Resultado:

              Name            Team  Number Position   Age Height  Weight            College     Salary
0    Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0
1      Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0
2     John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN
3      R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.0
4    Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0         No College  5000000.0
..             ...             ...     ...      ...   ...    ...     ...                ...        ...
453   Shelvin Mack       Utah Jazz     8.0       PG  26.0    6-3   203.0             Butler  2433333.0
454      Raul Neto       Utah Jazz    25.0       PG  24.0    6-1   179.0         No College   900000.0
455   Tibor Pleiss       Utah Jazz    21.0        C  26.0    7-3   256.0         No College  2900000.0
456    Jeff Withey       Utah Jazz    24.0        C  26.0    7-0   231.0             Kansas   947276.0
457            NaN             NaN     NaN      NaN   NaN    NaN     NaN         No College        NaN

[458 rows x 9 columns]

Exemplo #2: Usando o parâmetro do método

No exemplo a seguir, o método é definido como ffill e, portanto, o valor anterior na mesma coluna substitui o valor nulo. Nesse caso, Georgia State substituiu o valor nulo na coluna College das linhas 4 e 5. Da mesma forma, os métodos bfill, backfill e pad também podem ser usados.

import pandas as pd

nba = pd.read_csv("nba.csv") 

# substituindo os valores nan na coluna 'College'
# pelo valor da linha anterior
nba["College"].fillna( method ='ffill', inplace = True) 
print(nba.head(10))

Resultado:

            Name            Team  Number Position   Age Height  Weight            College      Salary
0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas   7730337.0
1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette   6796117.0
2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University         NaN
3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State   1148640.0
4  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0      Georgia State   5000000.0
5   Amir Johnson  Boston Celtics    90.0       PF  29.0    6-9   240.0      Georgia State  12000000.0
6  Jordan Mickey  Boston Celtics    55.0       PF  21.0    6-8   235.0                LSU   1170960.0
7   Kelly Olynyk  Boston Celtics    41.0        C  25.0    7-0   238.0            Gonzaga   2165160.0
8   Terry Rozier  Boston Celtics    12.0       PG  22.0    6-2   190.0         Louisville   1824360.0
9   Marcus Smart  Boston Celtics    36.0       PG  22.0    6-4   220.0     Oklahoma State   3431040.0

Exemplo #3: Usando limit

Neste exemplo, um limite de 1 é definido no método fillna() para verificar se a função para de substituir após uma substituição bem-sucedida do valor NaN ou não.

import pandas as pd

nba = pd.read_csv("nba.csv")

# substituindo os valores nan na coluna 'College'
# pelo valor da linha anterior com limite de
# uma substuição
nba["College"].fillna(method ='ffill', limit=1, inplace=True) 
print(nba.head(10))
            Name            Team  Number Position   Age Height  Weight            College      Salary
0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas   7730337.0
1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette   6796117.0
2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University         NaN
3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State   1148640.0
4  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0      Georgia State   5000000.0
5   Amir Johnson  Boston Celtics    90.0       PF  29.0    6-9   240.0                NaN  12000000.0
6  Jordan Mickey  Boston Celtics    55.0       PF  21.0    6-8   235.0                LSU   1170960.0
7   Kelly Olynyk  Boston Celtics    41.0        C  25.0    7-0   238.0            Gonzaga   2165160.0
8   Terry Rozier  Boston Celtics    12.0       PG  22.0    6-2   190.0         Louisville   1824360.0
9   Marcus Smart  Boston Celtics    36.0       PG  22.0    6-4   220.0     Oklahoma State   3431040.0

Resultado: Conforme mostrado na saída, a coluna College da 4ª linha foi substituída, mas a 5ª não foi, pois o limite foi definido como 1.

Artigo escrito por Kartikaybhutani e traduzido por Acervo Lima de Python | Pandas DataFrame.fillna() to replace Null values in dataframe

0 comentários:

Postar um comentário