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