如何创建用于合并不同条目的滑动窗口?

2024-04-25 14:15:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧df

id   datetime_event        cameraid    platenumber
11   2017-05-01T00:00:08   AAA         11A
12   2017-05-01T00:00:08   AAA         223
13   2017-05-01T00:00:08   BBB         11A
14   2017-05-01T00:00:09   BBB         33D
15   2017-05-01T00:00:09   DDD         44F
16   2017-05-01T01:01:00   AAA         44F
17   2017-05-01T01:01:01   BBB         44F
18   2017-05-01T01:01:09   AAA         556
19   2017-05-01T01:01:09   AAA         778
20   2017-05-01T01:01:11   EEE         666

对于每天的每一小时,我要选择多达100个条目,它们在(AAA,BBB)中有title,并且相同的platenumber依次出现在AAABBB。你知道吗

例如,对于上面给定的示例数据帧,输出如下:

id   datetime_event        cameraid    platenumber
11   2017-05-01T00:00:08   AAA         11A
13   2017-05-01T00:00:08   BBB         11A
16   2017-05-01T01:01:00   AAA         44F
17   2017-05-01T01:01:01   BBB         44F

每天每小时的前100个条目可以通过以下方式提取:

df = df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 100]

但是,如何按title过滤和(最重要的是)如何按platenumber合并,以便相同的platenumber值随后出现,首先在AAA中,然后在BBB中?你知道吗


Tags: 数据eventid示例dfdatetimetitle条目
1条回答
网友
1楼 · 发布于 2024-04-25 14:15:17

使用filter

编辑:

#first filter only AAA, BBB for less data
df = df[df['cameraid'].isin(['AAA','BBB'])]

df1 = (df.groupby([pd.to_datetime(df['datetime_event']).dt.floor('H'),'platenumber'])
         .filter(lambda x: (x['cameraid'].values == ['AAA','BBB']).all()))
print (df1)
    d       datetime_event cameraid platenumber
0  11  2017-05-01T00:00:08      AAA         11A
2  13  2017-05-01T00:00:08      BBB         11A
5  16  2017-05-01T01:01:00      AAA         44F
6  17  2017-05-01T01:01:01      BBB         44F

旧解决方案:

#first filter only AAA, BBB for less data
df = df[df['cameraid'].isin(['AAA','BBB'])]

#filter only 2 size groups and check if 1. value is AAA and 2. BBB
def f(x):
    return len(x) == 2 and \
           x['cameraid'].iat[0] == 'AAA' and \
           x['cameraid'].iat[1] == 'BBB'

df = df.groupby([pd.to_datetime(df['datetime_event']).dt.floor('H'),'platenumber']).filter(f)
print (df)
    d       datetime_event cameraid platenumber
0  11  2017-05-01T00:00:08      AAA         11A
2  13  2017-05-01T00:00:08      BBB         11A
5  16  2017-05-01T01:01:00      AAA         44F
6  17  2017-05-01T01:01:01      BBB         44F

相关问题 更多 >