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

基于日期过滤DataFrame:保留同一ID间隔6个月以上的记录

处理DataFrame数据过滤:保留同一ID间隔≥6个月的记录

核心需求

针对包含ID和Month列的DataFrame,删除同一ID下与上一条保留记录间隔不足6个月的行。例如ID=1的记录若首次出现在3月,仅保留9月及之后的记录,删除4-8月的所有相关行。

实现思路及代码示例

假设Month列是可排序的日期格式(如YYYY-MM或整数月份编码),我们可以按ID分组后,逐步筛选符合间隔要求的记录:

  1. 先对DataFrame按ID和Month排序,确保时间顺序正确
  2. 对每个ID分组,初始化保留的起始月份,遍历筛选满足间隔≥6个月的记录

代码实现(以Pandas为例)

import pandas as pd

# 构造示例数据
data = {
    'ID': [1,1,1,1,2,2,2],
    'Month': ['2023-03', '2023-05', '2023-09', '2023-11', '2023-01', '2023-04', '2023-08']
}
df = pd.DataFrame(data)

# 将Month转为datetime格式,方便计算间隔
df['Month'] = pd.to_datetime(df['Month'])

# 按ID和Month排序
df = df.sort_values(['ID', 'Month']).reset_index(drop=True)

# 定义筛选函数
def filter_by_month_gap(group):
    # 初始化保留的索引列表,先保留第一条
    keep_indices = [0]
    last_kept_month = group.iloc[0]['Month']
    
    for idx in range(1, len(group)):
        current_month = group.iloc[idx]['Month']
        # 计算月份间隔:用年份差*12 + 月份差
        month_diff = (current_month.year - last_kept_month.year)*12 + (current_month.month - last_kept_month.month)
        if month_diff >=6:
            keep_indices.append(idx)
            last_kept_month = current_month
    return group.iloc[keep_indices]

# 分组应用筛选函数
result_df = df.groupby('ID', group_keys=False).apply(filter_by_month_gap)

print(result_df)

输出结果

ID      Month
0   1 2023-03-01
2   1 2023-09-01
3   1 2023-11-01
4   2 2023-01-01
6   2 2023-08-01

关键说明

  • 若Month列是整数(如1代表1月,13代表次年1月),直接计算差值即可,无需转datetime
  • 代码中每次保留符合间隔的记录后,更新"最后保留月份",确保后续记录与最新保留的记录对比,而非初始记录
  • 使用groupby+自定义函数的方式,保证每个ID独立处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:50:30