df = pd.DataFrame({
                  'A': [15, '-', 173, 190, 68],
                  'B': ['-', 254, '-', 16, 76],
                  'C': [12, '-', 110, 35, 98],
                  'D': [125, 89, 308, 211, 174],
                  'E': [19, 21, '-', 162, '-']
                  })

Tengo dos columnas que quiero multiplicar entre sí, pero estas columnas incluyen "-". Antes de convertir el guión en flotante o reemplazarlo con 0, puedo hacer una multiplicación, pero no quiero demasiados guiones. Además, cuando exporto mis datos a Excel, mis datos se convierten en cadenas debido a estos guiones. Los quiero todos como enteros o flotantes, pero incluyen guiones. ¿Es posible? ¿Cómo puedo multiplicar estas columnas sin eliminar el guión (-)?

0
user11615945 18 oct. 2019 a las 11:30

1 respuesta

La mejor respuesta

Creo que tu idea es la mejor: reemplaza - por algo numérico, p. Ej. por NaN, porque para múltiples son necesarios todos los valores numéricos:

df = df.mask(df.values == '-').astype(float)

O:

df = df.apply(pd.to_numeric, errors='coerce')

print (df)
       A      B      C      D      E
0   15.0    NaN   12.0  125.0   19.0
1    NaN  254.0    NaN   89.0   21.0
2  173.0    NaN  110.0  308.0    NaN
3  190.0   16.0   35.0  211.0  162.0
4   68.0   76.0   98.0  174.0    NaN

Último si es necesario - de vuelta:

df = df.fillna('-')

O convierta los valores faltantes mediante el parámetro na_rep en DataFrame.to_excel:

df.to_excel(file, na_rep='-')

Pero es posible con probar-esperar en la función, pero realmente lento, por lo que no se recomienda:

def mult_with_dash(x):
    try:
        return float(x['A']) * float(x['E']) 
    except Exception:
        return '-'

df['new'] = df.apply(mult_with_dash, axis=1)
print (df)
     A    B    C    D    E    new
0   15    -   12  125   19    285
1    -  254    -   89   21      -
2  173    -  110  308    -      -
3  190   16   35  211  162  30780
4   68   76   98  174    -      -
1
jezrael 18 oct. 2019 a las 08:51