Este es mi DataFrame:

d = {'col1': ['sku 1.1', 'sku 1.2', 'sku 1.3'], 'col2': ['9.876.543,21', 654, '321,01']}
df = pd.DataFrame(data=d)
df

       col1           col2
0   sku 1.1   9.876.543,21
1   sku 1.2            654
2   sku 1.3         321,01

Los datos en col2 son números en formato local, que me gustaría convertir a:

      col2
9876543.21
       654
    321.01

Intenté df['col2'] = pd.to_numeric(df['col2'], downcast='float'), que devuelve un ValueError:: No se puede analizar la cadena "9.876.543,21" en la posición 0.

También probé df = df.apply(lambda x: x.str.replace(',', '.')), que devuelve ValueError: no se pudo convertir la cadena en flotante: '5.023.654.46'

¡Gracias por tu ayuda!

7
andrej 3 mar. 2018 a las 22:41

3 respuestas

La mejor respuesta

Lo mejor es usar, si es posible, los parámetros en read_csv:

df = pd.read_csv(file, thousands='.', decimal=',')

Si no es posible, entonces replace debería ayudar:

df['col2'] = (df['col2'].replace('\.','', regex=True)
                        .replace(',','.', regex=True)
                        .astype(float))
16
jezrael 3 mar. 2018 a las 19:49

Siempre es mejor usar las instalaciones estándar del sistema donde existan. Sabiendo que algunos locales usan comas y puntos decimales de manera diferente, no podía creer que Pandas no usaría los formatos del local.

Efectivamente, una búsqueda rápida reveló esta esencia, que explica cómo usar las configuraciones regionales para convertir cadenas a los números En esencia, necesita import locale y, después de haber creado el marco de datos, llame al locale.setlocale para establecer un entorno local que utilice comas como puntos decimales y puntos para los separadores, luego aplique el método applymapp del marco de datos.

0
holdenweb 3 mar. 2018 a las 20:15

Puedes probar

df = df.apply(lambda x: x.replace(',', '&'))
df = df.apply(lambda x: x.replace('.', ','))
df = df.apply(lambda x: x.replace('&', '.'))
-1
Tanuj Yadav 3 mar. 2018 a las 19:48