gpt4 book ai didi

python - Pandas:在每个 id 的一列中第一次出现值后删除行

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:54 24 4
gpt4 key购买 nike

我使用的数据框如下所示:

ID Alarm
1 1
1 2
1 3
2 3
2 1
2 2
2 4
3 4
3 2

在第一次出现 Alarm = 2 后,我想分别删除每个 ID 的所有行。因此输出应该是:

ID Alarm
1 1
1 2
2 3
2 1
2 2
3 4
3 2

最简单的方法是什么?这种情况下是否存在 pandas 方法?我尝试用 loc 制作一些东西:df.loc[: df[(df['Alarm'] == 2)].index[0], :]) 但它在第一次 Alarm = 2 出现后删除所有行,与 ID 无关。

最佳答案

您可以使用 boolean indexing使用由 groupby 创建的 mask具有自定义功能。

对于每组首先比较shift值,因为需要首先包含 2。然后用eq比较2 .但还需要在每组 2 下匹配多个值,所以需要 cumsum并与 0 进行比较 - False 行被删除。

df = df[df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2).cumsum().eq(0))]
print (df)
ID Alarm
0 1 1
1 1 2
3 2 3
4 2 1
5 2 2
7 3 4
8 3 2

为了更好地理解更多数据:

df['a'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift())
df['b'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2))
df['c'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2).cumsum())
df['d'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2).cumsum().eq(0))
print (df)
ID Alarm a b c d
0 1 1 NaN False 0 True
1 1 2 1.0 False 0 True
2 1 2 2.0 True 1 False
3 1 2 2.0 True 2 False
4 1 3 2.0 True 3 False
5 2 3 NaN False 0 True
6 2 1 3.0 False 0 True
7 2 2 1.0 False 0 True
8 2 4 2.0 True 1 False
9 3 4 NaN False 0 True
10 3 2 4.0 False 0 True

关于python - Pandas:在每个 id 的一列中第一次出现值后删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46073683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com