python - 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
解决方案
您可以在列group
上的数据框id
并将其进行比较以创建一个布尔掩码,然后使用带有此掩码的布尔索引将列中的值更新为:shift
target
1
target
1
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
推荐阅读
- python - 我想裁剪一个深度框架并获得一个裁剪的深度框架,以便我可以在裁剪的深度框架上应用一些方法
- android - 根检查将某些 android 非设备识别为已根 - Dotfuscator
- python - 在 aci 中部署机器学习模型时出现错误
- priority-queue - AnyLogic 中来自 2 个源的优先级队列
- cypress - 如何在赛普拉斯中使用 sheetJS 更新现有 Excel 上的单元格值
- android - 删除 sqllite 中的记录是一个一个或一个列表更快
- asp.net - 在 cloudflare 中创建子域,添加托管在 IIS 上的新网站返回 HTTP 404 错误
- sql - Oracle Apex 交互式网格根据条件禁用 ROW
- qnamaker - 导出的 QnA maker 知识库上的 BF CLI 解析错误
- python - Django,Docker - 由于未安装 Pillow,因此无法使用 ImageField