Python 熊猫根据当前行值分组Id更新上一行和下一行值
我有dataframe,df,并希望更改每个“Id”的“Status”列中的值 规则是: 如果'Status'='High'将之前的行更新为'before'Else'After' 数据帧df: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
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'})