0
respostas

[Sugestão] ValueError - Valores NaN atribuídos às colunas geradas pelo método assign não podem ser convertidos

As atribuições de novas colunas com o método assign do código abaixo retorna alguns valores NaN:

populacao_estados = populacao_estados.assign(
    populacao_sem_parenteses = populacao_estados['POPULAÇÃO'].str.replace(
        '\(\d{1,2}\)', # Valor procurado
        '', # Valor da substituição
        regex=True # Força a busca via RegEx.
    ),
    populacao = lambda x: x.loc[:, 'populacao_sem_parenteses'].replace(
        '\.', 
        '', 
        regex=True
    )
)

Daí quando executo o código abaixo para fazer a conversão, ela não funciona:

populacao_estados = populacao_estados.astype({'populacao': 'int64'})
populacao_estados
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-206-947896d39e97> in <cell line: 0>()
----> 1 populacao_estados = populacao_estados.astype({'populacao': 'int64'})
      2 populacao_estados

7 frames
/usr/local/lib/python3.11/dist-packages/pandas/core/dtypes/astype.py in _astype_nansafe(arr, dtype, copy, skipna)
    131     if copy or arr.dtype == object or dtype == object:
    132         # Explicit copy, or required since NumPy can't view from / to object.
--> 133         return arr.astype(dtype, copy=True)
    134 
    135     return arr.astype(dtype, copy=copy)

ValueError: cannot convert float NaN to integer: Error while type casting for column 'populacao'

Resolvi o problema acrescentando o método fillna, logo depois do método replace, na atribuição da nova coluna populacao_sem_parenteses:

populacao_estados = populacao_estados.assign(
    populacao_sem_parenteses = populacao_estados['POPULAÇÃO'].str.replace(
        '\(\d{1,2}\)', # Valor procurado
        '', # Valor da substituição
        regex=True # Força a busca via RegEx.
    ).fillna(populacao_estados['POPULAÇÃO']),  # Aqui está a diferença do primeiro código.
    populacao = lambda x: x.loc[:, 'populacao_sem_parenteses'].replace(
        '\.', 
        '', 
        regex=True
    )
)