在 pandas 有条件的情况下在一个数据帧内移动几个部分

Shift several parts inside one dataframe in pandas with condition

我有一个数据框如下。为简单起见,它有 A 列、B 列、正确移位(我想要得到的)和错误移位(我现在拥有的)。我想根据列 'B' 中的条件移动列 'A' 中的值。如果我将使用 pd.DataFrame.shift(1) 则它将整个列移动 1。但我想使用一种移动 window 进行移动,即在一个数据帧内移动多个部分。例如,我想根据列 'B' 中的值将列 'A' 中的所有行移动 1,即移动条件为 'aaa' 的所有行,然后移动条件为 [=127= 的所有行] 和条件 'ccc' 等的所有行。在 'Correctly Shifted' 列中是我想要的,在 'Incorrectly Shifted' 列中是我得到的,如果只是在 pandas 中使用 shift 方法。解决它的最佳方法是什么?

一个 B 正确移位 错位
100 aaa
110 aaa 100 100
120 aaa 110 110
100 bbb 120
110 bbb 100 100
120 bbb 110 110
100 ccc 120
110 ccc 100 100
120 ccc 110 110

尝试:

df["My Shift"] = df.groupby("B")["A"].shift()
print(df)

打印:

     A    B  Correctly Shifted  Incorrectly Shifted  My Shift
0  100  aaa                NaN                  NaN       NaN
1  110  aaa              100.0                100.0     100.0
2  120  aaa              110.0                110.0     110.0
3  100  bbb                NaN                120.0       NaN
4  110  bbb              100.0                100.0     100.0
5  120  bbb              110.0                110.0     110.0
6  100  ccc                NaN                120.0       NaN
7  110  ccc              100.0                100.0     100.0
8  120  ccc              110.0                110.0     110.0

尝试将 groupbyshift 一起使用:

df['A'] = df.groupby('B')['A'].shift()
print(df)

输出:

       A    B
0    NaN  aaa
1  100.0  aaa
2  110.0  aaa
3    NaN  bbb
4  100.0  bbb
5  110.0  bbb
6    NaN  ccc
7  100.0  ccc
8  110.0  ccc