python - 根据 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
解决方案
用于案例1和GroupBy.transform
用于案例2:Series.where
GroupBy.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
推荐阅读
- neo4j - Neo4j 如何查询所有子节点
- javascript - 如何在 VSCode 中保存文件时自动运行测试?
- grafana - 如何在 Jsonnet 中为 Grafana 仪表板模板填充变量
- python - DateFormatter pandas 在重新采样 DF Hourly 后绘制错误的日期
- oracle - 在 oracle apex 中需要在页面加载时隐藏项目取决于从 DB 中选择的值
- spring - 在一对多关系 Spring Boot 中显示特定用户的项目列表(按 id)
- kubernetes - GKE Autopilot 的节点自动缩放问题
- python - 有没有更 Pythonic 的方式来实现条件计数?
- wordpress - 是什么导致我的 Yoast SEO 站点地图上出现 500 错误?
- python - 在循环中添加约束的问题