Pandas groupby分组后筛选最新3条数据均满足条件的ID
实现方案
核心逻辑
你可以分两步处理:
- 按ID分组后,每组按时间倒序排序,先筛选出记录数≥3的分组,再取每个分组最新的3条数据
- 校验每个分组取出的3条数据的Value是否全部小于10,保留符合条件的ID即可
完整代码
import pandas as pd import datetime # 构造示例DataFrame df = pd.DataFrame({'ID': [1,1,1,1,2,2,2,3], 'Time': [datetime.date(2019, 12, 1), datetime.date(2019, 12, 5),datetime.date(2019, 12, 8),datetime.date(2019, 8, 4),datetime.date(2019, 11, 4),datetime.date(2019, 11, 4),datetime.date(2019, 11, 3),datetime.date(2019, 12, 20)], 'Value':[2,2,2,50,7,100,7,5]}) # 业务逻辑实现 result = ( df.groupby('ID', group_keys=False) # 每组按时间倒序取最新3条 .apply(lambda group: group.sort_values('Time', ascending=False).head(3)) # 二次按ID分组 .groupby('ID') # 过滤两个条件:记录数等于3、所有Value都小于10 .filter(lambda x: len(x) == 3 and (x['Value'] < 10).all()) # 取唯一ID输出 ['ID'].unique() ) result_df = pd.DataFrame({'ID': result}) print(result_df)
输出结果
ID 0 1
逻辑说明
- ID1分组排序后最新3条的Value分别为2、2、2,全部小于10,符合要求
- ID2分组最新3条中存在Value为100的记录,不符合要求
- ID3分组仅有1条记录,不满足3条的校验前提,直接排除
内容的提问来源于stack exchange,提问作者The L
相关产品推荐
相关产品推荐

