GroupBy根据列值删除前导行和最后一行



我有一个数据帧df:-

成功成功成功单击[/tr>表格电子邮件成功点击[/tr>成功电子邮件网页电子邮件//tr>表格网页成功
ID 日期 事件
1 30-10-2013
1 2013年8月11日
1 2013年6月12日
1 2014年2月24日
1 2014年2月24日
1 2014年4月3日
1 2014年4月15日
1 2014年4月16日
1 2014年5月17日
1 2014年6月21日
1 2014年1月1日
1 2014年3月7日
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"

最新更新