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

如何在Pandas分组(groupby)后筛选日期时间数据?

按分组筛选最后N天数据的实现方法

问题说明

原始数据如下:

A      Day-1
A      Day-2
A      Day-5
B      Day-3
B      Day-7

需求是按分组(如A、B)保留每组最后N天的数据,当N=4时,期望结果为:

A      Day-2
A      Day-5
B      Day-7

筛选逻辑:

  • 分组A的最后一天是Day-5,取Day2到Day5这4天范围内的现有数据,保留Day-2、Day-5
  • 分组B的最后一天是Day-7,取Day4到Day7这4天范围内的现有数据,保留Day-7

已尝试用df.groupby(['name']).tail(1)获取每组最后一条数据,但不知道如何基于此进一步筛选范围内的日期。

解决方案

可以通过以下步骤实现:

1. 提取日期数字并转换为数值类型

先把day列中的数字提取出来,转为整数方便后续计算:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'name': ['A', 'A', 'A', 'B', 'B'],
    'day': ['Day-1', 'Day-2', 'Day-5', 'Day-3', 'Day-7']
})

# 提取日期中的数字,转为整数类型
df['day_num'] = df['day'].str.extract(r'Day-(\d+)').astype(int)

2. 按分组标记每组的最后一天日期

用groupby结合transform,给每行添加本组的最大日期值,方便判断当前行是否在目标范围内:

N = 4  # 需要保留的最后N天
df['max_day'] = df.groupby('name')['day_num'].transform('max')

3. 筛选符合条件的行

筛选出日期数字大于等于max_day - N + 1的行,最后移除辅助列即可:

filtered_df = df[df['day_num'] >= df['max_day'] - N + 1]
# 保留原始列,删除辅助列
filtered_df = filtered_df[['name', 'day']]

运行后得到的filtered_df就是期望结果:

name    day
1    A  Day-2
2    A  Day-5
4    B  Day-7

简化写法(合并步骤)

可以把步骤合并为一行,减少中间变量:

N = 4
df['day_num'] = df['day'].str.extract(r'Day-(\d+)').astype(int)
filtered_df = df[df['day_num'] >= df.groupby('name')['day_num'].transform('max') - N + 1][['name', 'day']]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:35:17