首页 > 解决方案 > 根据 groupby 条件删除行

问题描述

我有以下带有(“ID”,“月份”和“状态”)的数据框。状态是关于“流失”= 1 和“未流失”= 2。

     ID     Month   Status
     3863   201707  1
     3863   201708  1
     3863   201709  1
     3863   201710  1
     3863   201711  1
     3863   201712  1
     3863   201801  1
     3863   201802  1
     3863   201803  1
     3863   201804  1
     3863   201805  1
     3863   201806  1
     3863   201807  2
     3863   201808  2
     3863   201809  2
     3863   201810  2
     3863   201811  2
     3863   201812  2
     3863   201901  2
     3863   201902  2
     3863   201903  2
     3863   201904  2
     3863   201905  2
     3863   201906  2
     3863   201907  2
     3863   201908  1
     3863   201909  1
     3863   201910  1
     3863   201911  1
     3863   201912  1

我必须删除在观察期间状态 = 2 但在状态 = 1 之后的客户的所有状态 = 1(流失)的行(客户处于非活动状态,然后重新激活自己)

转换后数据框应如下所示

     ID     Month   Status
     3863   201807  2
     3863   201808  2
     3863   201809  2
     3863   201810  2
     3863   201811  2
     3863   201812  2
     3863   201901  2
     3863   201902  2
     3863   201903  2
     3863   201904  2
     3863   201905  2
     3863   201906  2
     3863   201907  2
     3863   201908  1

标签: pythonpandasdataframe

解决方案


用于案例1GroupBy.transform用于案例2Series.whereGroupBy.bfill

case1 = df['Status'].eq(1).groupby(df['ID']).transform('all')
case2 = (df['Status'].where(df['Status'].ne(1))
                     .groupby(df['ID'])
                     .bfill()
                     .eq(2)
                     .mul(df['Status'].eq(1)))
df_filtered = df.loc[~(case1|case2)]
print(df_filtered)

      ID   Month  Status
7   2311  201710       2
8   2311  201711       2
9   2311  201712       2
10  2312  201708       2
11  2312  201709       2
12  2312  201710       2
13  2312  201711       2
14  2312  201712       1

推荐阅读