Pandas:按日期范围/精确 ID 过滤

我正在寻找基于另一个只有三列的小得多的数据框来过滤一个大数据框(数百万行):ID、开始、结束。


以下是我放在一起的内容(有效),但似乎groupby()或np.where可能更快。


设置:


import pandas as pd

import io


csv = io.StringIO(u'''

time    id  num

2018-01-01 00:00:00 A   1

2018-01-01 01:00:00 A   2

2018-01-01 02:00:00 A   3

2018-01-01 03:00:00 A   4

2018-01-01 04:00:00 A   5

2018-01-01 05:00:00 A   6

2018-01-01 06:00:00 A   6

2018-01-03 07:00:00 B   10

2018-01-03 08:00:00 B   11

2018-01-03 09:00:00 B   12

2018-01-03 10:00:00 B   13

2018-01-03 11:00:00 B   14

2018-01-03 12:00:00 B   15

2018-01-03 13:00:00 B   16

2018-05-29 23:00:00 C   111

2018-05-30 00:00:00 C   122

2018-05-30 01:00:00 C   133

2018-05-30 02:00:00 C   144

2018-05-30 03:00:00 C   155

''')


df = pd.read_csv(csv, sep = '\t')

df['time'] = pd.to_datetime(df['time'])


csv_filter = io.StringIO(u'''

id  start   end

A   2018-01-01 01:00:00 2018-01-01 02:00:00

B   2018-01-03 09:00:00 2018-01-03 12:00:00

C   2018-05-30 00:00:00 2018-05-30 08:00:00

''')


df_filter = pd.read_csv(csv_filter, sep = '\t')

df_filter['start'] = pd.to_datetime(df_filter['start'])

df_filter['end'] = pd.to_datetime(df_filter['end'])

工作代码


df = pd.merge_asof(df, df_filter, left_on = 'time', right_on = 'start', by = 'id').dropna(subset = ['start']).drop(['start','end'], axis = 1)

df = pd.merge_asof(df, df_filter, left_on = 'time', right_on = 'end', by = 'id', direction = 'forward').dropna(subset = ['end']).drop(['start','end'], axis = 1)

输出


                  time id  num

0  2018-01-01 01:00:00  A    2

1  2018-01-01 02:00:00  A    3

6  2018-01-03 09:00:00  B   12

7  2018-01-03 10:00:00  B   13

8  2018-01-03 11:00:00  B   14

9  2018-01-03 12:00:00  B   15

11 2018-05-30 00:00:00  C  122

12 2018-05-30 01:00:00  C  133

13 2018-05-30 02:00:00  C  144

14 2018-05-30 03:00:00  C  155

关于更优雅/更快的解决方案的任何想法?


开心每一天1111
浏览 163回答 1
1回答

慕的地6264312

为什么不是merge在过滤之前。请注意,当数据集很大时,这会占用您的内存。newdf=df.merge(df_filter)newdf=newdf.loc[newdf.time.between(newdf.start,newdf.end),df.columns.tolist()]newdfOut[480]:                   time id  num1  2018-01-01 01:00:00  A    22  2018-01-01 02:00:00  A    39  2018-01-03 09:00:00  B   1210 2018-01-03 10:00:00  B   1311 2018-01-03 11:00:00  B   1412 2018-01-03 12:00:00  B   1515 2018-05-30 00:00:00  C  12216 2018-05-30 01:00:00  C  13317 2018-05-30 02:00:00  C  14418 2018-05-30 03:00:00  C  155
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python