You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对分组后的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)

代码说明

  1. 日期转换:将字符串类型的Date转为datetime格式,指定dayfirst=True匹配输入的日/月/年顺序,方便时间比较
  2. 分组筛选函数:filter_group针对每个Id分组执行规则逻辑,优先处理online状态的记录,无online则取最新记录
  3. 分组应用:按Id分组后调用筛选函数,group_keys=False避免分组键干扰结果结构,最后将日期转回原字符串格式保证输出一致

内容的提问来源于stack exchange,提问作者user19956605

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:12:43