如何删除“事件”之后每个 id 等于 1 的行?

How can I remove the lines that after the 'events' first equals 1 for each id?

提问人:Kevin Song 提问时间:1/5/2023 更新时间:1/6/2023 访问量:50

问:

这是我的数据:在此处输入图像描述

黄色部分是每个 id 的“事件”第一个等于 1 之前的行,绿色部分是每个 id 的“事件”第一个等于 1 之后的行。 注意:每个 id 的“events”等于 1 的行属于黄色部分 我想要黄色部分,绿色部分将被删除。

最终数据可能是这样的: 在此处输入图像描述 如何使用 Excel 或 Python 来解决这个问题?

Python Excel DataFrame 数据操作

评论

1赞 starball 1/5/2023
欢迎!请编辑以将您的文本图像转换为实际文本。请看这里了解原因。另请参阅:“如何在帖子中设置表格格式”。

答:

0赞 Shirin Yavari 1/6/2023 #1

让我们从构建数据帧 df 开始:

import pandas as pd
id = [1,1,1,1,1,1,1,2,2,2,2,2]
date = ['2018-05-15','2018-07-13','2018-08-09','2018-09-01','2018-10-03','2018-11-04','2018-12-01','2014-04-29','2014-05-22','2018-06-24','2014-07-24','2014-09-01']
events = [0,0,0,1,1,0,1,0,1,0,0,1]

df = pd.DataFrame({'id':id,
                   'date':date,
                   'events': events})
df['date'] = pd.to_datetime(df['date'])
print(df)

enter image description here

现在这是您需要的:

def remove_rows(df):
    df = df.reset_index(drop=True)
    if df[df['events'] == 1].index.empty:
        return df
    return df.loc[:df[df['events'] == 1].index[0]]

result = df.groupby('id').apply(lambda x: remove_rows(x)).reset_index(drop=True)
print(result)

这将给你:

enter image description here