Python 如何从大型数据集中提取每天每小时500个条目?
我有一个数据框,有将近200万个条目。我想创建此数据帧的子集 特别是,我想要的是在数据集中每天每小时获取500个条目。结果应保存在新的数据框Python 如何从大型数据集中提取每天每小时500个条目?,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个数据框,有将近200万个条目。我想创建此数据帧的子集 特别是,我想要的是在数据集中每天每小时获取500个条目。结果应保存在新的数据框res中。有一个名为datetime\u event的列,创建dates如下dates=pd.to\u datetime(df['datetime\u event']) 这是我的代码,但需要很多小时才能完成。是否可以稍微优化它,例如使用apply和lambda counter = 0 current_hour = 0 res = pd.DataFrame(c
res
中。有一个名为datetime\u event
的列,创建dates
如下dates=pd.to\u datetime(df['datetime\u 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
我想得到一个子集res
,它将包含每小时的前N个条目(例如,如下面示例中的前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
更新:
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
使用:
df=df[df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')).cumcount()<3]
打印(df)
id日期时间\事件标题
0 11 2017-05-01T00:00:08 AAA
1122017-05-01T00:00:08英国广播公司
21312017-05-01T00:00:08中央空调
516 2017-05-01T01:01:00 EEE
617 2017-05-01T01:01:01 EEE
718 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='2T',periods=10**5)})
df['val']=np.arange(len(df))
在[29]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路15.8毫秒
在[30]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路15.8毫秒
df=pd.DataFrame({'datetime_event':pd.date_range('2000-01-01',freq='2S',periods=10**5)})
df['val']=np.arange(len(df))
在[33]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路14.1毫秒
在[34]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路14.5毫秒
使用:
df=df[df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')).cumcount()<3]
打印(df)
id日期时间\事件标题
0 11 2017-05-01T00:00:08 AAA
1122017-05-01T00:00:08英国广播公司
21312017-05-01T00:00:08中央空调
516 2017-05-01T01:01:00 EEE
617 2017-05-01T01:01:01 EEE
718 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='2T',periods=10**5)})
df['val']=np.arange(len(df))
在[29]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路15.8毫秒
在[30]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路15.8毫秒
df=pd.DataFrame({'datetime_event':pd.date_range('2000-01-01',freq='2S',periods=10**5)})
df['val']=np.arange(len(df))
在[33]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路14.1毫秒
在[34]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路14.5毫秒
您能否添加一些样本数据和所需输出,例如3个条目,而不是500个可验证样本?@jezrael:请检查我的更新。问题在于在使用for
循环时计算时间过长,我想找到一些可以减少这一时间的解决方案。您能否添加一些样本数据和所需的输出,例如3个条目,而不是500个可验证样本?@jezrael:请检查我的更新。问题在于使用for
循环时计算时间长,我想找到一些可以减少这一时间的解决方案。好主意,我尝试了。虽然两种解决方案都很好,但我更喜欢这一种,因为在这种情况下,我不需要创建新列val
@diologius,请检查我答案中的更新部分-我没有在那里添加新列…;-)好主意,我尝试了。虽然两种解决方案都很好,但我更喜欢这一种,因为在这种情况下,我不需要创建新列val
@degonalius,请检查我答案中的更新部分-我没有在那里添加新列…;-)更新很好。不幸的是,我不能接受两个答案:)非常感谢。@Digoraius,当然,没问题:)更新很好。不幸的是,我不能接受两个答案:)非常感谢。@Digonalius,当然,没问题:)
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