如何对分组后的DataFrame按多条件进行自定义筛选?
需求实现:按规则筛选DataFrame记录
输入数据
Id Status Date 0 Id001 off 01/01/2022 1 Id001 online 01/06/2022 2 Id002 off 05/12/2021 3 Id002 off 30/08/2021 4 Id003 running 02/03/2021 5 Id004 online 21/10/2021 6 Id004 running 01/04/2022 7 Id005 online 01/02/2022 8 Id005 online 02/07/2022
期望输出
Id Status Date 0 Id001 online 01/06/2022 1 Id002 off 05/12/2021 2 Id003 running 02/03/2021 3 Id004 online 21/10/2021 4 Id005 online 01/02/2022
筛选规则
若某Id分组中存在«online»状态:
若«online»出现次数>1:
选择最早出现«online»的记录
否则:
选择该«online»状态的记录
否则:
选择最新的记录
当前尝试代码
import pandas as pd import numpy as np df = pd.DataFrame({'Id': ['Id001','Id001','Id002','Id002','Id003','Id004','Id004','Id005','Id005'], 'Status': ['off','online','off','off','running','online','running','online','online'], 'Date': ['01/01/2022','01/06/2022','05/12/2021','30/08/2021','02/03/2021','21/10/2021','01/04/2022','01/02/2022','02/07/2022']}) df.groupby(['Id', 'Status'], as_index=False).agg({'Date' : [np.min, np.max]}).reset_index()
可行解决方案
完整代码
import pandas as pd # 构造数据 df = pd.DataFrame({ 'Id': ['Id001','Id001','Id002','Id002','Id003','Id004','Id004','Id005','Id005'], 'Status': ['off','online','off','off','running','online','running','online','online'], 'Date': ['01/01/2022','01/06/2022','05/12/2021','30/08/2021','02/03/2021','21/10/2021','01/04/2022','01/02/2022','02/07/2022'] }) # 转换日期格式,适配输入的日/月/年结构 df['Date'] = pd.to_datetime(df['Date'], dayfirst=True) def filter_group(group): # 提取分组内的online记录 online_records = group[group['Status'] == 'online'] if not online_records.empty: # online记录多条时取最早的,否则直接取该记录 if len(online_records) > 1: return online_records.nsmallest(1, 'Date') else: return online_records else: # 无online记录时取最新的记录 return group.nlargest(1, 'Date') # 按Id分组执行筛选,重置索引并还原日期格式 result = df.groupby('Id', group_keys=False).apply(filter_group).reset_index(drop=True) result['Date'] = result['Date'].dt.strftime('%d/%m/%Y') print(result)
代码说明
- 日期转换:将字符串类型的
Date转为datetime格式,指定dayfirst=True匹配输入的日/月/年顺序,方便时间比较 - 分组筛选函数:
filter_group针对每个Id分组执行规则逻辑,优先处理online状态的记录,无online则取最新记录 - 分组应用:按Id分组后调用筛选函数,
group_keys=False避免分组键干扰结果结构,最后将日期转回原字符串格式保证输出一致
内容的提问来源于stack exchange,提问作者user19956605
相关产品推荐
相关产品推荐

