Home > Software engineering >  Max consecutive NaN's and filling them with values
Max consecutive NaN's and filling them with values

Time:06-27

I want to get the number of consecutive NaN's in each column and if the maximum of these consecutive NaN's are smaller than, let's say 3, then I want to fill those with the first prior non-NaN value, and if it's more than 3, then remove the whole column. Here's a small part of my dataset to work with.

>>> df
    113550    100285  112283  101668    114157  100019
0      NaN  27.60000     NaN     NaN       NaN     NaN
1      NaN  27.50000     NaN     NaN  36.25000     NaN
2      NaN  27.25000     NaN     NaN  36.25000    22.5
3      NaN  27.90000     NaN     NaN  47.33333    22.5
4      NaN  28.00000     NaN     NaN       NaN     NaN
5      NaN  27.66667     NaN     NaN  36.25000     NaN
6      NaN  26.41667     NaN     NaN  40.00000     NaN
7      NaN       NaN     NaN     NaN  36.25000     NaN
8      NaN  27.87500     NaN     NaN  41.87500    22.5
9      NaN  27.85000     NaN     NaN  46.66667    22.5
10     NaN  27.45000     NaN     NaN  40.00000    22.5
11     NaN  27.45000     NaN     NaN  41.75000     NaN
12     NaN  26.43750     NaN     NaN  40.00000     NaN
13     NaN  26.50000     NaN     NaN  41.75000     NaN
14     NaN  26.60000     NaN     NaN  41.75000    22.5
15     NaN  26.60000     NaN     NaN  41.75000    22.5
16     NaN  24.62500     NaN     NaN  39.83333     NaN
17     NaN  24.60000     NaN     NaN  41.75000     NaN
18     NaN  24.50000     NaN     NaN       NaN    22.5
19     NaN  23.62500     NaN     NaN  41.87500     NaN

CodePudding user response:

From Identifying consecutive NaNs with Pandas, you can use:

consecutive_nans = lambda x: x.isna().groupby(x.notna().cumsum()).sum().max()
out = df[df.apply(consecutive_nans).loc[lambda x: x <= 3].index].ffill().bfill()
print(out)

# Output
      100285    114157
0   27.60000  36.25000
1   27.50000  36.25000
2   27.25000  36.25000
3   27.90000  47.33333
4   28.00000  47.33333
5   27.66667  36.25000
6   26.41667  40.00000
7   26.41667  36.25000
8   27.87500  41.87500
9   27.85000  46.66667
10  27.45000  40.00000
11  27.45000  41.75000
12  26.43750  40.00000
13  26.50000  41.75000
14  26.60000  41.75000
15  26.60000  41.75000
16  24.62500  39.83333
17  24.60000  41.75000
18  24.50000  41.75000
19  23.62500  41.87500
  • Related