es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convierto ‘$ -‘ de una cadena a un número decimal utilizando pandas?

Tengo información financiera que he mantenido en un documento de Excel durante un tiempo y me gustaría ejecutar un código Python sobre ella, pero tengo problemas para convertir los tipos de objeto a floats. El problema parece ser el ‘$ -‘

Así es como se ve la data cuando se carga:

import pandas as pd
dfData = {'Item': ['Producto 1','Producto 2','Producto 3'],
          'Costo': [14.87,'-9.47','$ -']
}
df = pd.DataFrame(dfData, columns=['Item','Costo'])
df
        Item    Costo
0  Producto 1   14.87
1  Producto 2   -9.47
2  Producto 3   $ -

He intentado lo siguiente:

df['Costo'] = df['Costo'].str.replace('$','').str.replace(' -','').astype('float')

…así como otros comandos similares de str.replace, pero sigo obteniendo el siguiente error:

ValueError: could not convert string to float: ''

Esta es mi primera publicación en Stack Overflow, así que ¡sean comprensivos conmigo! He buscado por todas partes una solución, pero por alguna razón no puedo encontrar una que aborde este problema específico. Tampoco puedo reemplazar el ‘-‘ porque la fila 1 lo tiene, lo que indica un valor negativo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la cadena ”$ -” en la columna ‘Costo’. Una solución sería reemplazar esa cadena por un valor NaN, que luego se puede eliminar fácilmente del DataFrame. Aquí tienes un ejemplo de código que debería ayudarte:

    import pandas as pd
    
    # Cargar los datos
    dfData = {'Artículo': ['Producto 1', 'Producto 2', 'Producto 3'],
              'Costo': [14.87, '-9.47', '$ -']}
    df = pd.DataFrame(dfData, columns=['Artículo', 'Costo'])
    
    # Reemplazar '$ -' con NaN
    df['Costo'] = df['Costo'].apply(lambda x: float(x) if x[0] != '$' else pd.np.nan)
    
    # Eliminar los valores NaN
    df.dropna(inplace=True)
    
    # Convertir la columna 'Costo' a números decimales
    df['Costo'] = df['Costo'].astype('float')
    
    # Mostrar el DataFrame actualizado
    print(df)
    

    Esto debería mostrar:

           Artículo  Costo
    0  Producto 1  14.87
    1  Producto 2  -9.47
    

    Aquí, primero reemplazamos la cadena ”$ -” con NaN utilizando una función lambda aplicada a la columna ‘Costo’. Luego podemos eliminar los valores NaN utilizando el método dropna() del DataFrame. Finalmente, convertimos los valores restantes en la columna ‘Costo’ a números decimales utilizando el método astype().

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.