Primer valor no nulo por fila de una lista de columnas de Pandas
Si tengo un DataFrame en pandas que se parece a:
A B C
0 1 NaN 2
1 NaN 3 NaN
2 NaN 4 5
3 NaN NaN NaN
¿Cómo puedo obtener el primer valor no nulo de cada fila? Por ejemplo, para lo anterior, me gustaría obtener: [1, 3, 4, None]
(o una serie equivalente).
Aceptado
Complete los nans de la izquierda con fillna
, luego obtenga la columna más a la izquierda:
df.fillna(method='bfill', axis=1).iloc[:, 0]
Esta es una forma realmente complicada de hacer esto, primero úsela first_valid_index
para obtener las columnas válidas, convierta la serie devuelta en un marco de datos para que podamos llamar apply
por filas y usar esto para indexar de nuevo al df original:
In [160]:
def func(x):
if x.values[0] is None:
return None
else:
return df.loc[x.name, x.values[0]]
pd.DataFrame(df.apply(lambda x: x.first_valid_index(), axis=1)).apply(func,axis=1)
Out[160]:
0 1
1 3
2 4
3 NaN
dtype: float64
EDITAR
Una forma un poco más limpia:
In [12]:
def func(x):
if x.first_valid_index() is None:
return None
else:
return x[x.first_valid_index()]
df.apply(func, axis=1)
Out[12]:
0 1
1 3
2 4
3 NaN
dtype: float64