Primer valor no nulo por fila de una lista de columnas de Pandas

Resuelto Dave Challis asked hace 9 años • 9 respuestas

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).

Dave Challis avatar Aug 05 '15 16:08 Dave Challis
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]
Andy Jones avatar Jun 21 '2016 08:06 Andy Jones

Esta es una forma realmente complicada de hacer esto, primero úsela first_valid_indexpara obtener las columnas válidas, convierta la serie devuelta en un marco de datos para que podamos llamar applypor 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
EdChum avatar Aug 05 '2015 09:08 EdChum