我有一个数据帧df
:-
ID | 日期 | 事件 |
---|---|---|
1 | 30-10-2013 | 成功|
1 | 2013年8月11日 | 成功|
1 | 2013年6月12日 | 成功|
1 | 2014年2月24日 | 单击[/tr>|
1 | 2014年2月24日 | 表格|
1 | 2014年4月3日 | 电子邮件|
1 | 2014年4月15日 | 成功|
1 | 2014年4月16日 | 点击[/tr>|
1 | 2014年5月17日 | 成功|
1 | 2014年6月21日 | 电子邮件|
1 | 2014年1月1日 | 网页|
1 | 2014年3月7日 | 电子邮件//tr>|
2 | 2014年7月5日 | 表格|
2 | 2014年8月6日 | 网页|
2 | 2014年7月9日 | 成功
如果数据帧已经排序,这应该可以工作:
df["n"] = df.groupby("ID")["Event"].transform(lambda x: (x == "Success").shift(1, fill_value=0).cumsum())
df["keep"] = df.groupby(["ID", "n"])["Event"].transform(lambda x: (len(x) > 1) & (x.iloc[-1] == "Success"))
result = df.loc[df["keep"]].drop(columns=["keep", "n"])
一点解释:
- "n〃;对包含一个"1"的一组行进行编号;成功";,使用此技巧:https://www.codeforests.com/2021/03/30/group-consecutive-rows-in-pandas/
- "保持";基于包含多于1行(不仅仅是单个"成功"(并且最后一行是"成功"的行组创建过滤器;成功
更新版本(根据评论(:
df["n"] = df.groupby("ID")["Event"].transform(lambda x: (x == "Success").shift(1, fill_value=0).cumsum())
df["keep"] = df.groupby(["ID", "n"])["Event"].transform(lambda x: (len(x) > 1))
df = df.loc[df["keep"]] # remove leading "Success" rows
df["keep"] = df.groupby("ID")["n"].transform(lambda x: x != x.max() if len(x.unique()) > 1 else True)
df = df.loc[df["keep"]] # remove trailing rows after last "Success"