基于日期列条件过滤DataFrame?分组后删除行遇阻
问题解决:保留包含指定状态的用户-日期组所有行
原始数据
UserId Activity_date Status A 27-01-2022 initiated A 27-01-2022 In_process A 27-01-2022 Success A 28-01-2022 initiated A 28-01-2022 Completed A 30-01-2022 initiated A 30-01-2022 failed B 26-01-2022 initiated B 26-01-2022 Completed B 26-01-2022 Success B 27-01-2022 initiated
需求
删除同一UserId+Activity_date组中未出现Success或Completed状态的所有条目。即只要某用户的某日期下存在这两个状态之一,该日期的所有行都保留;否则整组删除。
解决方案
核心思路是先标记出符合条件的用户-日期组,再筛选出这些组的所有数据。用pandas的分组+transform方法可以高效实现:
import pandas as pd # 1. 构造示例数据(已有DataFrame可跳过此步) data = { 'UserId': ['A','A','A','A','A','A','A','B','B','B','B'], 'Activity_date': ['27-01-2022','27-01-2022','27-01-2022','28-01-2022','28-01-2022','30-01-2022','30-01-2022','26-01-2022','26-01-2022','26-01-2022','27-01-2022'], 'Status': ['initiated','In_process','Success','initiated','Completed','initiated','failed','initiated','Completed','Success','initiated'] } df = pd.DataFrame(data) # 2. 对每个用户-日期组,标记是否包含目标状态 df['is_valid'] = df.groupby(['UserId', 'Activity_date'])['Status'].transform( lambda x: x.isin(['Success', 'Completed']).any() ) # 3. 筛选有效组数据并移除临时列 result_df = df[df['is_valid']].drop('is_valid', axis=1) # 输出结果 print(result_df)
运行结果
UserId Activity_date Status 0 A 27-01-2022 initiated 1 A 27-01-2022 In_process 2 A 27-01-2022 Success 3 A 28-01-2022 initiated 4 A 28-01-2022 Completed 7 B 26-01-2022 initiated 8 B 26-01-2022 Completed 9 B 26-01-2022 Success
关键步骤说明
groupby(['UserId', 'Activity_date']):按用户和日期分组,确保判断的是同一用户同一天的状态集合。x.isin(['Success', 'Completed']).any():检查组内是否存在目标状态,返回布尔值。transform:将组级别的布尔值映射到组内每一行,实现整组数据的筛选。
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

