user308827
user308827

Reputation: 22011

Applying rolling median across row for pandas dataframe

I would like to apply a rolling median to replace NaN values in the following dataframe, with a window size of 3:

 1990      1991      1992      1993      1994      1995      1996      1997      1998      1999      2000      2001      2002      2003      2004  ...      2007      2008      2009       2010       2011       2012       2013       2014       2015       2016       2017       2018       2019  2020  2021

17  366000.0  278000.0  330000.0  NaN  434000.0  470600.0  433000.0  456000.0  556300.0  580200.0  635300.0  690600.0  800000.0  NaN  821500.0  ...  850800.0  905000.0  947500.0  1016500.0  1043900.0  1112800.0  1281900.0  1312700.0  1422000.0  1526900.0  1580000.0  1599000.0  1580000.0   NaN   NaN

However pandas rolling function seems to work for columns and not along a row. How can i fix this? Also, the solution should NOT change any of the non NAN values in that row

Upvotes: 2

Views: 564

Answers (1)

tdy
tdy

Reputation: 41407

First compute the rolling medians by using rolling() with axis=1 (row-wise), min_periods=0 (to handle NaN), and closed='both' (otherwise left edge gets excluded).

Then replace only the NaN entries with these medians by using fillna().

medians = df.rolling(3, min_periods=0, closed='both', axis=1).median()
df = df.fillna(medians)

#         1990      1991      1992      1993      1994      1995      1996      1997      1998      1999  ...       2012       2013       2014       2015       2016       2017       2018       2019       2020       2021
# 17  366000.0  278000.0  330000.0  330000.0  434000.0  470600.0  433000.0  456000.0  556300.0  580200.0  ...  1112800.0  1281900.0  1312700.0  1422000.0  1526900.0  1580000.0  1599000.0  1580000.0  1580000.0  1589500.0

Upvotes: 3

Related Questions