在 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
尝试将 groupby
与 shift
一起使用:
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
我有一个数据框如下。为简单起见,它有 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
尝试将 groupby
与 shift
一起使用:
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