首页 > 解决方案 > pandas 根据前一行设置值,每组只设置一次

问题描述

我有df这样的:

id  date  target
1      1.1    1
1      2.1    0
2      1.1    1
3      1.1    1 
3      2.1    0

我想更改target如果在上一行中出现“1”且相同id的列,则将下一行(只有它)更改为 1

渴望输出:

id    date target
1      1.1    1
1      2.1    1
2      1.1    1
3      1.1    1 
3      2.1    1

我尝试了什么:

def change_df(frame):
    for row in range(frame.shape[0]) :
        if frame["target"][row]==1 and frame.loc[row+1,"id"]==frame.loc[row,"id"] :
                frame.loc[row+1,"target"]=1
    return frame

但它改变了所有的行(因为循环)TNX

标签: pythonpandasdataframe

解决方案


您可以在列group上的数据框id并将其进行比较以创建一个布尔掩码,然后使用带有此掩码的布尔索引将列中的值更新为:shifttarget1target1

m = df.groupby('id')['target'].shift().eq(1)
df.loc[m, 'target'] = 1

>>> df

   id  date  target
0   1   1.1       1
1   1   2.1       1
2   2   1.1       1
3   3   1.1       1
4   3   2.1       1

推荐阅读