如何从大型数据集中提取每天每小时500个条目?

时间:2017-10-22 08:56:10

标签: python python-2.7 pandas

我有一个包含近200万个条目的DataFrame。我想创建此DataFrame的子集。

特别是,我想要的是在数据集中每天每小时获取500个条目。结果应保存在新的DataFrame res中。有一个名为datetime_event的列,dates创建如下dates = pd.to_datetime(df['datetime_event'])

这是我的代码,但需要很长时间才能完成。是否可以稍微优化它,例如使用applylambda

counter = 0
current_hour = 0
res = pd.DataFrame(columns=df.columns)
for i in range(0,len(df.index)):
   hour = dates.dt.hour[i]
   if current_hour != hour:
       current_hour = hour
       counter = 0
   if counter <= 500:
       res.loc[i] = df.loc[i]
       counter += 1

更新

示例DataFrame df

id   datetime_event        title
11   2017-05-01T00:00:08   AAA
12   2017-05-01T00:00:08   BBB
13   2017-05-01T00:00:08   CCC
14   2017-05-01T00:00:09   BBB
15   2017-05-01T00:00:09   DDD
16   2017-05-01T01:01:00   EEE
17   2017-05-01T01:01:01   EEE
18   2017-05-01T01:01:09   DDD
19   2017-05-01T01:01:09   EEE
20   2017-05-01T01:01:11   EEE

我想获得一个子集res,它包含每小时的前N个条目(例如,前面3个条目,如下例所示):

id   datetime_event        title
11   2017-05-01T00:00:08   AAA
12   2017-05-01T00:00:08   BBB
13   2017-05-01T00:00:08   CCC
16   2017-05-01T01:01:00   EEE
17   2017-05-01T01:01:01   EEE
18   2017-05-01T01:01:09   DDD

2 个答案:

答案 0 :(得分:3)

<强>更新

In [22]: df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
Out[22]:
   id       datetime_event title
0  11  2017-05-01T00:00:08   AAA
1  12  2017-05-01T00:00:08   BBB
2  13  2017-05-01T00:00:08   CCC
5  16  2017-05-01T01:01:00   EEE
6  17  2017-05-01T01:01:01   EEE
7  18  2017-05-01T01:01:09   DDD

答案 1 :(得分:2)

使用:

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

print (df)
   id       datetime_event title
0  11  2017-05-01T00:00:08   AAA
1  12  2017-05-01T00:00:08   BBB
2  13  2017-05-01T00:00:08   CCC
5  16  2017-05-01T01:01:00   EEE
6  17  2017-05-01T01:01:01   EEE
7  18  2017-05-01T01:01:09   DDD

<强>计时

df = pd.DataFrame({'datetime_event':pd.date_range('2000-01-01', freq='2T', periods=10**5)})

df['val'] = np.arange(len(df))


In [29]: %timeit df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
100 loops, best of 3: 15.8 ms per loop

In [30]: %timeit df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 3]
100 loops, best of 3: 15.8 ms per loop
df = pd.DataFrame({'datetime_event':pd.date_range('2000-01-01', freq='2S', periods=10**5)})

df['val'] = np.arange(len(df))

In [33]: %timeit df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
100 loops, best of 3: 14.1 ms per loop

In [34]: %timeit df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 3]
100 loops, best of 3: 14.5 ms per loop