Home > Back-end >  Shift multiple columns of data to the left direction to fill empty values
Shift multiple columns of data to the left direction to fill empty values

Time:08-26

Given a dataframe df as follows, note that for each date column, we have 3 not-na values:

         date      value     20211003     20211010     20211017     20211024
0   2021-9-19  3613.9663          NaN          NaN          NaN          NaN
1   2021-9-26  3613.0673          NaN          NaN          NaN          NaN
2   2021-10-3  3568.1668          NaN          NaN          NaN          NaN
3  2021-10-10  3592.1666  3631.411799          NaN          NaN          NaN
4  2021-10-17  3572.3662  3637.792491  3677.656329          NaN          NaN
5  2021-10-24  3582.6036  3678.800911  3707.926324  3712.669694          NaN
6  2021-10-31  3547.3361          NaN  3731.336899  3735.695071  3733.021293
7   2021-11-7  3491.5677          NaN          NaN  3749.422639  3743.507496
8  2021-11-14  3539.1002          NaN          NaN          NaN  3737.851787
9  2021-11-21  3560.3734          NaN          NaN          NaN          NaN

I would like to reshape it to a new dataframe with columns: date, value, pred1, pred2, pred3 by: shifting date columns (20211003, 20211010, 20211017, 20211024) of data to the left direction to fill empty values.

The expected result will like this:

         date      value        pred1        pred2        pred3
0   2021-9-19  3613.9663          NaN          NaN          NaN
1   2021-9-26  3613.0673          NaN          NaN          NaN
2   2021-10-3  3568.1668          NaN          NaN          NaN
3  2021-10-10  3592.1666  3631.411799          NaN          NaN
4  2021-10-17  3572.3662  3637.792491  3677.656329          NaN
5  2021-10-24  3582.6036  3678.800911  3707.926324  3712.669694
6  2021-10-31  3547.3361  3731.336899  3735.695071  3733.021293
7   2021-11-7  3491.5677  3749.422639  3743.507496          NaN
8  2021-11-14  3539.1002  3737.851787          NaN          NaN
9  2021-11-21  3560.3734          NaN          NaN          NaN

Anyone could help to deal this issue? Thanks.

CodePudding user response:

df.iloc[:,:2].join(pd.DataFrame(df.iloc[:, 2:].agg(lambda x: list(x.dropna()), axis=1).to_list()))

         date      value            0            1            2
0   2021-9-19  3613.9663          NaN          NaN          NaN
1   2021-9-26  3613.0673          NaN          NaN          NaN
2   2021-10-3  3568.1668          NaN          NaN          NaN
3  2021-10-10  3592.1666  3631.411799          NaN          NaN
4  2021-10-17  3572.3662  3637.792491  3677.656329          NaN
5  2021-10-24  3582.6036  3678.800911  3707.926324  3712.669694
6  2021-10-31  3547.3361  3731.336899  3735.695071  3733.021293
7   2021-11-7  3491.5677  3749.422639  3743.507496          NaN
8  2021-11-14  3539.1002  3737.851787          NaN          NaN
9  2021-11-21  3560.3734          NaN          NaN          NaN

In steps:

pd.DataFrame(df.iloc[:, 2:].agg(lambda x: list(x.dropna()), axis=1).to_list())
Out[57]: 
             0            1            2
0          NaN          NaN          NaN
1          NaN          NaN          NaN
2          NaN          NaN          NaN
3  3631.411799          NaN          NaN
4  3637.792491  3677.656329          NaN
5  3678.800911  3707.926324  3712.669694
6  3731.336899  3735.695071  3733.021293
7  3749.422639  3743.507496          NaN
8  3737.851787          NaN          NaN
9          NaN          NaN          NaN

Then join/concatenate/ to the original first 2 columns

  • Related