1
resposta

[Dúvida] Uso do replace ao invés do apply com lambda

Na atividade proposta de limpar a coluna preco do dataframe: moveis_disponiveis.json

A respota da atividade fica assim:

# importamos a biblioteca numpy
import numpy as np

# utilizamos o método fillna para preencher os elementos vazios por '0.0'
# definimos o parâmetro de inplace para True para substituir no DataFrame
dt_data['preco'].fillna('0.0', inplace = True)

# apagamos o $ e as vírgulas com apply lambda
dt_data['preco'] = dt_data['preco'].apply(lambda x: x.replace('$', '').replace(',',''))

# transformamos os tipos de dados para float64
dt_data['preco'] = dt_data['preco'].astype(np.float64)

# observamos o resultado final
dt_data

Entretanto, tentei fazer desta maneira

dt_data.preco.fillna('0.0', inplace = True)
dt_data.preco = dt_data.preco.str.replace('$','').replace(',','')
dt_data.preco = dt_data.preco.astype(np.float64)

E obtive o seguinte erro:

ValueError: could not convert string to float: '1,000.00'

As duas maneiras não são equivalentes? Onde fica o meu erro? Ao utilizar o str.replace os dados ainda continuam em string e não conseguem fazer a conversão?

1 resposta

Oi Rafael, o problema está em não adicionar um segundo '.str' na segunda chamada do replace.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

No print vc pode ver que se vc tentar fazer sem o .str no segundo replace, não existe alteração nos valores. Sem essa alteração, a vírgula se mantém nas divisões de milhar e a função de conversão encontra um valor que não está no padrão esperado.