Tengo un marco de datos pandas como abajo:

import pandas as pd
df = pd.DataFrame({'ORDER':["A", "A"], 'col1':[np.nan, np.nan], 'col2':[np.nan, 5]})
df

    ORDER   col1    col2
0    A      NaN     NaN
1    A      NaN     5.0

Quiero crear una columna 'nueva' como suma (col1, col2) ignorando a Nan solo si una de las columnas es Nan, si ambas columnas tienen un valor de NaN, debería devolver NaN como se muestra a continuación

Intenté el siguiente código y funciona bien. ¿Hay alguna manera de lograr lo mismo con solo una línea de código?

df['new'] = df[['col1', 'col2']].sum(axis = 1)
df['new'] = np.where(pd.isnull(df['col1']) & pd.isnull(df['col2']), np.nan, df['new'])
df
    ORDER   col1    col2    new
0    A      NaN      NaN    NaN
1    A      NaN      5.0    5.0
0
Shanoo 24 jul. 2020 a las 16:39

3 respuestas

La mejor respuesta

Hacer sum con min_count

df['new'] = df[['col1','col2']].sum(axis=1,min_count=1)
Out[78]: 
0    NaN
1    5.0
dtype: float64
3
YOBEN_S 24 jul. 2020 a las 13:42

Use la función add en las dos columnas, que toma un argumento fill_value que le permite reemplazar NaN:

df['col1'].add(df['col2'], fill_value=0) 

0    NaN
1    5.0
dtype: float64
3
BallpointBen 24 jul. 2020 a las 13:47

¿Está bien?

df['new'] = df[['col1', 'col2']].sum(axis = 1).replace(0,np.nan)
0
gtomer 24 jul. 2020 a las 13:45