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

如何对按时间排序的DataFrame按ID进行条件筛选与截断?

问题描述

我有一个按年份时间顺序排序的DataFrame df,数据结构如下:

idstatus
6014
6014
6012
6012
6012
6014
6014
6012
6012
6014
6012
9904
9902
9904

需要实现两个处理结果:

结果一

每个ID的status必须以2开头,删除该ID开头所有status为4的记录;同时保留从第一个2到首次出现4的后续连续4的记录,最终结果如下:

idstatus
6012
6012
6012
6014
6014
9902
9904

结果二

每个ID的记录需以status为4结尾,删除最后一个4之后的所有记录,最终结果如下:

idstatus
6012
6012
6012
6014
6014
6012
6012
6014
9902
9904

不清楚如何实现,能否通过筛选完成?


解决方案

可以通过Pandas的分组(groupby)、条件筛选和位置标记实现这两个需求,以下是具体代码:

实现结果一

import pandas as pd

# 构建示例数据
data = [
    (601,4), (601,4), (601,2), (601,2), (601,2), (601,4), (601,4),
    (601,2), (601,2), (601,4), (601,2), (990,4), (990,2), (990,4)
]
df = pd.DataFrame(data, columns=['id', 'status'])

def process_group_result1(group):
    # 找到当前组第一个status=2的索引
    first_2_idx = group[group['status'] == 2].index.min()
    if pd.isna(first_2_idx):
        return pd.DataFrame()  # 无status=2的组直接丢弃
    # 截取从第一个2开始的子数据集
    sub_group = group.loc[first_2_idx:]
    # 找到子数据集中第一个status=4的索引
    first_4_idx = sub_group[sub_group['status'] == 4].index.min()
    if pd.isna(first_4_idx):
        return sub_group  # 无status=4则保留所有从第一个2开始的记录
    # 找到第一个4之后的第一个非4记录的索引
    first_non_4_after_4 = sub_group.loc[first_4_idx:][sub_group['status'] !=4].index.min()
    if pd.isna(first_non_4_after_4):
        return sub_group
    else:
        return sub_group.loc[:first_non_4_after_4 - 1]

# 分组处理后重置索引
result1 = df.groupby('id', group_keys=False).apply(process_group_result1).reset_index(drop=True)
print(result1)

实现结果二

def process_group_result2(group):
    # 找到当前组最后一个status=4的索引
    last_4_idx = group[group['status'] ==4].index.max()
    if pd.isna(last_4_idx):
        return pd.DataFrame()  # 无status=4的组直接丢弃
    # 保留该索引及之前的所有记录
    return group.loc[:last_4_idx]

# 分组处理后重置索引
result2 = df.groupby('id', group_keys=False).apply(process_group_result2).reset_index(drop=True)
print(result2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:50:16