Search code examples
pandascopyrowsdiagonal

Diagonally copying values across rows and columns in pandas?


Here is a sample dataframe:

                     datetime temp  T1  T2  T3  T4  T5
115 2020-01-04 02:53:00+00:00   58   0   0   0   0   0
116 2020-01-04 03:53:00+00:00   51   0   0   0   0   0
117 2020-01-04 04:53:00+00:00   49   0   0   0   0   0
118 2020-01-04 05:53:00+00:00   48   0   0   0   0   0
119 2020-01-04 06:00:00+00:00   48   0   0   0   0   0
120 2020-01-04 06:53:00+00:00   47   0   0   0   0   0

And here is what I want the output to be :

                     datetime temp  T1  T2  T3  T4  T5
115 2020-01-04 02:53:00+00:00   58   0   0   0   0   0
116 2020-01-04 03:53:00+00:00   51   58  0   0   0   0
117 2020-01-04 04:53:00+00:00   49   51  58  0   0   0
118 2020-01-04 05:53:00+00:00   48   49  51  58  0   0
119 2020-01-04 06:00:00+00:00   48   48  49  51  58  0
120 2020-01-04 06:53:00+00:00   47   48  48  49  51  58

Solution

  • Use Series.shift

    for col in df.columns[df.columns.str.contains('T')]:
        df[col] = df['temp'].shift(int(col[1:]),fill_value = 0)
    print(df)
    

    We can also use pd.Index.difference

    for col in df.columns.difference(['datetime','temp']):
            df[col] = df['temp'].shift(int(col[1:]),fill_value = 0)
    

    Output

                          datetime  temp  T1  T2  T3  T4  T5
    115  2020-01-04-02:53:00+00:00    58   0   0   0   0   0
    116  2020-01-04-03:53:00+00:00    51  58   0   0   0   0
    117  2020-01-04-04:53:00+00:00    49  51  58   0   0   0
    118  2020-01-04-05:53:00+00:00    48  49  51  58   0   0
    119  2020-01-04-06:00:00+00:00    48  48  49  51  58   0
    120  2020-01-04-06:53:00+00:00    47  48  48  49  51  58