Python 根据时间筛选数据帧中的某些行
我有一组庞大的数据,这里显示了一个假人 在这里,事件就像一个循环。它可以从任何事件开始,在任何事件停止,但始终以事件结束。我得到的序列是基于时间的。我想在这里做的是只保留不完整的周期记录。例如,在上图中,event-1到event-final(前4行)表示循环已完成,因此我需要删除“final event”之前存在的所有行,并且我只需要包含“final event”之后事件的行(在上图中为event-2) 对于特定ID,大约有20个事件可以按任意顺序发生。所以我想做的就是在最后一个事件之前删除所有的行。我有时间列来获取序列 我的想法是根据时间按降序排序,并删除“最终事件”后的行。但我不知道如何在熊猫身上做到这一点。有人能帮忙吗 对于给定的数据,除了我的想法之外,还有更好的方法吗 编辑以按代码发布组(适用于@Joe Ferndz): 所以,这就是我所尝试的。我根据时间按降序排序,然后根据ID按groupby排序。然后在remove_循环中,我找出事件为“event final”的时间索引。然后我只返回具有更大时间列值的行 这可以达到目的,但速度较慢。更新版本:用于多个ID 此解决方案的灵感来源于此 输出将是:Python 根据时间筛选数据帧中的某些行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一组庞大的数据,这里显示了一个假人 在这里,事件就像一个循环。它可以从任何事件开始,在任何事件停止,但始终以事件结束。我得到的序列是基于时间的。我想在这里做的是只保留不完整的周期记录。例如,在上图中,event-1到event-final(前4行)表示循环已完成,因此我需要删除“final event”之前存在的所有行,并且我只需要包含“final event”之后事件的行(在上图中为event-2) 对于特定ID,大约有20个事件可以按任意顺序发生。所以我想做的就是在最后一个事件之前删除
ID Event time
8 001 event-1 09:08
9 001 event-2 09:09
17 002 event-1 09:17
18 002 event-2 09:18
19 002 event-3 09:19
对于数据帧:
ID Event time
0 001 event-1 09:00
1 001 event-2 09:01
2 001 event-3 09:02
3 001 event-final 09:03
4 001 event-1 09:04
5 001 event-2 09:05
6 001 event-3 09:06
7 001 event-final 09:07
8 001 event-1 09:08
9 001 event-2 09:09
10 002 event-1 09:10
11 002 event-2 09:11
12 002 event-3 09:12
13 002 event-final 09:13
14 002 event-1 09:14
15 002 event-2 09:15
16 002 event-final 09:16
17 002 event-1 09:17
18 002 event-2 09:18
单一ID的上一个答案
您可以找到上次出现的事件final
的索引,然后列出从该点开始的所有值。是的,在执行此操作之前,您需要按时间对_值进行排序并重置_索引
import pandas as pd
df = pd.DataFrame({'ID':['001']*10,
'Event':['event-1','event-2','event-3','event-final','event-1',
'event-2','event-3','event-final','event-1','event-2'],
'time':pd.date_range('2021-03-22 09:00:00', periods=10, freq="T")})
#converting time to string format to match your data
df['time'] = df['time'].dt.strftime("%H:%M")
#sorting time in ascending order (assume this is within same day
#if date goes beyond 24 hrs, then you should keep df['time'] in datetime format
df = df.sort_values(by='time').reset_index(drop=True)
print (df)
#find out the index of all events that have `event-final`
#and get only the last one using [-1]
idx = df.index[df['Event']=='event-final'][-1]
#using iloc or loc, you can get all records after the last `event-final` row
print (df.loc[idx+1:])
其输出将为:
原始数据帧:
ID Event time
0 001 event-1 09:00
1 001 event-2 09:01
2 001 event-3 09:02
3 001 event-final 09:03
4 001 event-1 09:04
5 001 event-2 09:05
6 001 event-3 09:06
7 001 event-final 09:07
8 001 event-1 09:08
9 001 event-2 09:09
没有事件最终值的最终数据帧
ID Event time
8 001 event-1 09:08
9 001 event-2 09:09
我有很多ID,不仅仅是“001”。那么,在这种情况下,我应该首先使用groupby,然后我必须使用apply函数,然后按照你说的做吗?啊!!!是的,如果您有许多ID,那么我们应该分组并选择值。让我创建一个具有多个ID的数据框,并发布一个更新的答案。已经很晚了。明天我会把答案贴出来。希望没问题。请尝试使用groupby进行探索。使用“变换”标记截断所需的行。通过这种方式,您可以从该点开始获取所有行。非常感谢,我使用group by和apply函数来获得所需的结果。这是很耗时的。我已经编辑了这篇文章,并按代码加入了该组。让我知道我在这方面可以改进的地方。我试着不完全复制粘贴您编写的相同代码,并根据您的想法自己进行了尝试。让我知道你的想法。非常感谢更新的答案,它比我的应用方法快得多
ID Event time
0 001 event-1 09:00
1 001 event-2 09:01
2 001 event-3 09:02
3 001 event-final 09:03
4 001 event-1 09:04
5 001 event-2 09:05
6 001 event-3 09:06
7 001 event-final 09:07
8 001 event-1 09:08
9 001 event-2 09:09
ID Event time
8 001 event-1 09:08
9 001 event-2 09:09