我有一个包含近200万个条目的DataFrame。我想创建此DataFrame的子集。
特别是,我想要的是在数据集中每天每小时获取500个条目。结果应保存在新的DataFrame res
中。有一个名为datetime_event
的列,dates
创建如下dates = pd.to_datetime(df['datetime_event'])
。
这是我的代码,但需要很长时间才能完成。是否可以稍微优化它,例如使用apply
和lambda
?
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
答案 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