如何通过 Pandas 中的循环移动所有列?

How to shift all columns through a loop in Pandas?

我是 Python 和 Pandas 的新手,我希望有人能帮助我。我有以下数据框:

import pandas as pd
from pandas import Timestamp

pd.DataFrame({'timestamp': {0: Timestamp('2021-06-01 00:00:00'),
  1: Timestamp('2021-06-01 01:00:00'),
  2: Timestamp('2021-06-01 02:00:00'),
  3: Timestamp('2021-06-01 03:00:00'),
  4: Timestamp('2021-06-01 04:00:00')},
 'column_0': {0: 384.0,
  1: 389.0,
  2: 352.0,
  3: 352.0,
  4: 356.0},
 'column_1': {0: 386.0,
  1: 352.0,
  2: 352.0,
  3: 356.0,
  4: 375.0},
 'column_2': {0: 352.0,
  1: 352.0,
  2: 356.0,
  3: 375.0,
  4: 365.0},
 'column_3': {0: 350.0,
  1: 356.0,
  2: 375.0,
  3: 365.0,
  4: 358.0},
 'column_4': {0: 359.0,
  1: 375.0,
  2: 365.0,
  3: 358.0,
  4: 347.0})
            timestamp  column_0  column_1  column_2  column_3  column_4
0 2021-06-01 00:00:00     384.0     386.0     352.0     350.0     359.0
1 2021-06-01 01:00:00     389.0     352.0     352.0     356.0     375.0
2 2021-06-01 02:00:00     352.0     352.0     356.0     375.0     365.0
3 2021-06-01 03:00:00     352.0     356.0     375.0     365.0     358.0
4 2021-06-01 04:00:00     356.0     375.0     365.0     358.0     347.0

我想要做的是将column_1中的数字向下移动一行,在column_2[=28=中] 向下两行,在 column_3 向下 3 行等等。

我知道这可以用代码完成

df['column_1'].shift(+1)
df['column_2'].shift(+2)
...

手动的方法太麻烦了,实际上总共有40多个这样的列。这就是为什么我想添加一个循环,这样代码就不会太长。 最后数据框应该是这样的:

            timestamp  column_0  column_1  column_2  column_3  column_4
0 2021-06-01 00:00:00     384.0     NaN       NaN       NaN       NaN
1 2021-06-01 01:00:00     389.0     386.0     NaN       NaN       NaN
2 2021-06-01 02:00:00     352.0     352.0     352.0     NaN       NaN
3 2021-06-01 03:00:00     352.0     352.0     352.0     350.0     NaN  
4 2021-06-01 04:00:00     356.0     356.0     356.0     356.0     359.0
...

有人知道怎么做吗?我不是很擅长编程,到目前为止我的尝试都失败了。如果有任何帮助,我将不胜感激。

您可以使用 df.columns 访问列名的有序序列。从那里可以快速迭代它们并在 enumerate 的帮助下移动列。由于您的第一列是您的时间戳,因此将枚举起始值设置为 -1 以对齐列移位。

for i, col in enumerate(df.columns, -1):
    if i > 0:
        df[col] = df[col].shift(i)