How to count the number of non-NaN values in every row of a pandas Dataframe ?

Published: February 24, 2023

Updated: February 24, 2023

Tags: Python; Pandas; Dataframe;

DMCA.com Protection Status

Counting the number of non-NaN values in every row of a pandas Dataframe can easily be done by using the count() function. Example:

Case study

import pandas as pd
import numpy as np

np.random.seed(42)

data = np.random.uniform(10,80, size=(4,6))

n = 15
index = np.random.choice(data.size, n, replace=False)

data.ravel()[index] = np.nan

df = pd.DataFrame(data,columns=['2023-02-01','2023-02-02','2023-02-03','2023-02-04','2023-02-05','2023-02-06'])

Output

   2023-02-01  2023-02-02  2023-02-03  2023-02-04  2023-02-05  2023-02-06
0         NaN         NaN   61.239576         NaN   20.921305         NaN
1   14.065853         NaN   52.078051         NaN         NaN    77.89369
2         NaN         NaN   22.727748         NaN         NaN    46.73295
3   40.236151    30.38604         NaN         NaN         NaN         NaN

Count the number of non-NaN values in every row

To use the pandas count() function, simply pass in your Dataframe as an argument and the count() function will return the number of non-NaN values for each row:

res = df.count(axis=1)

print(res)

Ouput

0    2
1    3
2    2
3    2
dtype: int64

The count function returns a pandas series:

type(res)

Ouput

pandas.core.series.Series

Get the values:

res.values

Output

array([2, 3, 2, 2])

Count only for specific columns

This can be further refined by including a parameter for only counting specific columns from the count. For example, if you wanted to only count column a and b, you could use the following code:

df[['2023-02-01','2023-02-02']].count(axis=1)

output

0    0
1    1
2    0
3    2
dtype: int64

References