Dave Challis - 1 year ago 71

Python Question

If I've got a DataFrame in pandas which looks something like:

`A B C`

0 1 NaN 2

1 NaN 3 NaN

2 NaN 4 5

3 NaN NaN NaN

How can I get the first non-null value from each row? E.g. for the above, I'd like to get:

`[1, 3, 4, None]`

Answer Source

This is a really messy way to do this, first use `first_valid_index`

to get the valid columns, convert the returned series to a dataframe so we can call `apply`

row-wise and use this to index back to original df:

```
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
```

**EDIT**

A slightly cleaner way:

```
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
```