如何对按时间排序的DataFrame按ID进行条件筛选与截断?
问题描述
我有一个按年份时间顺序排序的DataFrame df,数据结构如下:
| id | status |
|---|---|
| 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 |
需要实现两个处理结果:
结果一
每个ID的status必须以2开头,删除该ID开头所有status为4的记录;同时保留从第一个2到首次出现4的后续连续4的记录,最终结果如下:
| id | status |
|---|---|
| 601 | 2 |
| 601 | 2 |
| 601 | 2 |
| 601 | 4 |
| 601 | 4 |
| 990 | 2 |
| 990 | 4 |
结果二
每个ID的记录需以status为4结尾,删除最后一个4之后的所有记录,最终结果如下:
| id | status |
|---|---|
| 601 | 2 |
| 601 | 2 |
| 601 | 2 |
| 601 | 4 |
| 601 | 4 |
| 601 | 2 |
| 601 | 2 |
| 601 | 4 |
| 990 | 2 |
| 990 | 4 |
不清楚如何实现,能否通过筛选完成?
解决方案
可以通过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
相关产品推荐
相关产品推荐

