如何筛选ID与DATE相同且连续值≥14的DataFrame数据
问题描述
从给定的DataFrame中筛选出满足以下条件的所有列数据:
consecutive列的数值构成至少14分钟的连续序列(即必须包含1、2……14的连续值,更长的序列如1到20也符合要求)- 该连续序列对应的
ID与DATE必须保持一致
原始数据
ID DATE TIME start end consecutive 123 1/5/2016 0:00 1/5/2016 7:20 7 20 1 123 1/5/2016 0:00 1/5/2016 7:21 7 21 2 123 1/5/2016 0:00 1/5/2016 7:23 7 23 1 123 1/5/2016 0:00 1/5/2016 7:24 7 24 2 123 1/5/2016 0:00 1/5/2016 7:25 7 25 3 123 1/5/2016 0:00 1/5/2016 7:26 7 26 4 123 1/5/2016 0:00 1/5/2016 7:27 7 27 5 123 1/5/2016 0:00 1/5/2016 7:29 7 29 1 123 1/5/2016 0:00 1/5/2016 7:30 7 30 2 123 1/5/2016 0:00 1/5/2016 7:31 7 31 3 123 1/5/2016 0:00 1/5/2016 7:32 7 32 4 123 1/5/2016 0:00 1/5/2016 7:33 7 33 5 123 1/5/2016 0:00 1/5/2016 7:34 7 34 6 123 1/5/2016 0:00 1/5/2016 7:35 7 35 7 123 1/5/2016 0:00 1/5/2016 7:36 7 36 8 123 1/5/2016 0:00 1/5/2016 7:37 7 37 9 123 1/5/2016 0:00 1/5/2016 7:38 7 38 10 123 1/5/2016 0:00 1/5/2016 7:39 7 39 11 123 1/5/2016 0:00 1/5/2016 7:40 7 40 12 123 1/5/2016 0:00 1/5/2016 7:41 7 41 13 123 1/5/2016 0:00 1/5/2016 7:42 7 42 14 456 8/15/2015 0:00 8/15/2015 9:52 9 52 1 456 8/15/2015 0:00 8/15/2015 9:56 9 56 3 456 8/15/2015 0:00 8/15/2015 10:10 15 17 1 456 5/21/2015 0:00 5/21/2015 15:18 15 18 2 456 5/21/2015 0:00 5/21/2015 15:34 15 34 1 456 5/21/2015 0:00 5/21/2015 15:35 15 35 2 456 5/21/2015 0:00 5/21/2015 15:36 15 36 3 456 5/21/2015 0:00 5/21/2015 15:37 15 37 4 456 5/21/2015 0:00 5/21/2015 15:38 15 38 5 456 5/21/2015 0:00 5/21/2015 15:39 15 39 6 456 5/21/2015 0:00 5/21/2015 15:40 15 40 7 456 5/21/2015 0:00 5/21/2015 15:41 15 41 8 456 5/21/2015 0:00 5/21/2015 15:42 15 42 9 456 5/21/2015 0:00 5/21/2015 15:43 15 43 10 456 5/21/2015 0:00 5/21/2015 15:44 15 44 11 456 5/21/2015 0:00 5/21/2015 15:45 15 45 12 456 5/21/2015 0:00 5/21/2015 15:46 15 46 13 456 5/21/2015 0:00 5/21/2015 15:47 15 47 14 456 5/21/2015 0:00 5/21/2015 15:48 15 48 15 456 5/21/2015 0:00 5/21/2015 15:49 15 49 16 456 5/21/2015 0:00 5/21/2015 15:50 15 50 17 456 5/21/2015 0:00 5/21/2015 15:51 15 51 18 456 5/21/2015 0:00 5/21/2015 15:52 15 52 19 456 5/21/2015 0:00 5/21/2015 15:53 15 53 20
期望输出
ID DATE TIME start end consecutive 123 1/5/2016 0:00 1/5/2016 7:29 7 29 1 123 1/5/2016 0:00 1/5/2016 7:30 7 30 2 123 1/5/2016 0:00 1/5/2016 7:31 7 31 3 123 1/5/2016 0:00 1/5/2016 7:32 7 32 4 123 1/5/2016 0:00 1/5/2016 7:33 7 33 5 123 1/5/2016 0:00 1/5/2016 7:34 7 34 6 123 1/5/2016 0:00 1/5/2016 7:35 7 35 7 123 1/5/2016 0:00 1/5/2016 7:36 7 36 8 123 1/5/2016 0:00 1/5/2016 7:37 7 37 9 123 1/5/2016 0:00 1/5/2016 7:38 7 38 10 123 1/5/2016 0:00 1/5/2016 7:39 7 39 11 123 1/5/2016 0:00 1/5/2016 7:40 7 40 12 123 1/5/2016 0:00 1/5/2016 7:41 7 41 13 123 1/5/2016 0:00 1/5/2016 7:42 7 42 14 456 5/21/2015 0:00 5/21/2015 15:34 15 34 1 456 5/21/2015 0:00 5/21/2015 15:35 15 35 2 456 5/21/2015 0:00 5/21/2015 15:36 15 36 3 456 5/21/2015 0:00 5/21/2015 15:37 15 37 4 456 5/21/2015 0:00 5/21/2015 15:38 15 38 5 456 5/21/2015 0:00 5/21/2015 15:39 15 39 6 456 5/21/2015 0:00 5/21/2015 15:40 15 40 7 456 5/21/2015 0:00 5/21/2015 15:41 15 41 8 456 5/21/2015 0:00 5/21/2015 15:42 15 42 9 456 5/21/2015 0:00 5/21/2015 15:43 15 43 10 456 5/21/2015 0:00 5/21/2015 15:44 15 44 11 456 5/21/2015 0:00 5/21/2015 15:45 15 45 12 456 5/21/2015 0:00 5/21/2015 15:46 15 46 13 456 5/21/2015 0:00 5/21/2015 15:47 15 47 14 456 5/21/2015 0:00 5/21/2015 15:48 15 48 15 456 5/21/2015 0:00 5/21/2015 15:49 15 49 16 456 5/21/2015 0:00 5/21/2015 15:50 15 50 17 456 5/21/2015 0:00 5/21/2015 15:51 15 51 18 456 5/21/2015 0:00 5/21/2015 15:52 15 52 19 456 5/21/2015 0:00 5/21/2015 15:53 15 53 20
解决方案(Python Pandas)
以下代码可实现需求:
import pandas as pd # 读取数据(替换为你的数据路径或加载方式) # df = pd.read_csv("your_data.csv", sep="\s+") # 标记每个连续序列组 df['group_id'] = (df['consecutive'] != df['consecutive'].shift(1) + 1).cumsum() # 按ID、DATE、序列组分组,筛选包含1-14连续值的组 valid_groups = df.groupby(['ID', 'DATE', 'group_id']).filter( lambda x: set(range(1,15)).issubset(set(x['consecutive'])) ) # 移除临时列并输出结果 result = valid_groups.drop('group_id', axis=1) print(result.to_string(index=False))
代码说明
- 序列分组标记:通过对比当前行与前一行的
consecutive值,判断是否为新的连续序列,生成group_id标记每个独立序列 - 筛选有效序列:对每个
ID-DATE-序列组的子数据集,检查是否包含1到14的所有数值,保留符合条件的组 - 输出结果:删除临时的
group_id列,输出符合要求的完整数据
内容的提问来源于stack exchange,提问作者Priyanka Bansal
相关产品推荐
相关产品推荐

