Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据时间筛选数据帧中的某些行_Python_Pandas_Dataframe - Fatal编程技术网

Python 根据时间筛选数据帧中的某些行

Python 根据时间筛选数据帧中的某些行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一组庞大的数据,这里显示了一个假人 在这里,事件就像一个循环。它可以从任何事件开始,在任何事件停止,但始终以事件结束。我得到的序列是基于时间的。我想在这里做的是只保留不完整的周期记录。例如,在上图中,event-1到event-final(前4行)表示循环已完成,因此我需要删除“final event”之前存在的所有行,并且我只需要包含“final event”之后事件的行(在上图中为event-2) 对于特定ID,大约有20个事件可以按任意顺序发生。所以我想做的就是在最后一个事件之前删除

我有一组庞大的数据,这里显示了一个假人

在这里,事件就像一个循环。它可以从任何事件开始,在任何事件停止,但始终以事件结束。我得到的序列是基于时间的。我想在这里做的是只保留不完整的周期记录。例如,在上图中,event-1到event-final(前4行)表示循环已完成,因此我需要删除“final event”之前存在的所有行,并且我只需要包含“final event”之后事件的行(在上图中为event-2)

对于特定ID,大约有20个事件可以按任意顺序发生。所以我想做的就是在最后一个事件之前删除所有的行。我有时间列来获取序列

我的想法是根据时间按降序排序,并删除“最终事件”后的行。但我不知道如何在熊猫身上做到这一点。有人能帮忙吗

对于给定的数据,除了我的想法之外,还有更好的方法吗

编辑以按代码发布组(适用于@Joe Ferndz):

所以,这就是我所尝试的。我根据时间按降序排序,然后根据ID按groupby排序。然后在remove_循环中,我找出事件为“event final”的时间索引。然后我只返回具有更大时间列值的行

这可以达到目的,但速度较慢。

更新版本:用于多个ID 此解决方案的灵感来源于此

输出将是:

     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