Python 熊猫根据当前行值分组Id更新上一行和下一行值

Python 熊猫根据当前行值分组Id更新上一行和下一行值,python,pandas,dataframe,Python,Pandas,Dataframe,我有dataframe,df,并希望更改每个“Id”的“Status”列中的值 规则是: 如果'Status'='High'将之前的行更新为'before'Else'After' 数据帧df: Id Status 0 1 Low 1 1 Low 2 1 High 3 1 Low 4 2 Low 5 2 Low 6 2 High 7 2 Low

我有dataframe,df,并希望更改每个“Id”的“Status”列中的值

规则是: 如果'Status'='High'将之前的行更新为'before'Else'After'

数据帧df:

     Id     Status    
0    1      Low
1    1      Low
2    1      High
3    1      Low
4    2      Low
5    2      Low
6    2      High
7    2      Low
8    3      Low
9    3      Low
10   3      High
11   3      Low
12   3      High
13   3      Low
我的预期df:

     Id     Status
 0   1      Before
 1   1      Before
 2   1      High
 3   1      After
 4   2      Before
 5   2      Before
 6   2      High
 7   2      After
 8   3      Before
 9   3      Before
10   3      High
11   3      After
12   3      High
13   3      After 
这是到目前为止我的代码,(我还没有将规则else更改添加到'After'中)

我有一个错误:

ValueError: cannot index with vector containing NA / NaN values
用于将每组最后一次
High
后设置为
after
后,并将所有无
High
的值设置为
之前:

m1 = df['Status'].eq('High')
m2 = m1.groupby(df['Id']).cumsum() == 0

df['Status1'] = np.select([m1, m2], ['High', 'Before'], default='After') 
print (df)
    Id Status Status1
0    1    Low  Before
1    1    Low  Before
2    1   High    High
3    1    Low   After
4    2    Low  Before
5    2    Low  Before
6    2   High    High
7    2    Low   After
8    3    Low  Before
9    3    Low  Before
10   3   High    High
11   3    Low   After
12   3   High    High
13   3    Low   After

您可以使用映射功能:

df['Status'] = df['Status'].map({'High': 'After', 'Low': 'Before'})

不是预期的输出如果你仔细看,OP输出有点混乱是的,OP输出在这里是混乱的。我将编辑OP输出。@noishi-好的,为索引11添加了原始解决方案。为什么
之前
优先于
之后
,从技术上讲,11和13都遵循
否,是否检查输出?
df['Status'] = df['Status'].map({'High': 'After', 'Low': 'Before'})