Python 在将日期与列表进行比较时,将for循环替换为更有效的循环

Python 在将日期与列表进行比较时,将for循环替换为更有效的循环,python,Python,编辑:标题已更改,以反映map没有比for循环更有效 原始标题:在比较日期时将for循环替换为map 我有一个连续日期列表date\u list和一个数据框df,就目前而言,它包含一个名为事件日期的列,其中包含事件发生的日期: Index Event Date 0 02-01-20 1 03-01-20 2 03-01-20 我想知道在给定日期发生了多少事件,格式如下: Date Events 01-01-20 0 02-01-20 1 03-01-20

编辑:标题已更改,以反映
map
没有比
for
循环更有效

原始标题:在比较日期时将for循环替换为map

我有一个连续日期列表
date\u list
和一个数据框
df
,就目前而言,它包含一个名为
事件日期的列,其中包含事件发生的日期:

Index Event Date
0     02-01-20
1     03-01-20
2     03-01-20
我想知道在给定日期发生了多少事件,格式如下:

Date     Events
01-01-20   0
02-01-20   1
03-01-20   3
我目前的做法如下:

for date in date_list:
    event_rows = df.apply(lambda x: True if x['Event Date'] > date else False , axis=1)
    event_count = len(event_rows[event_rows == True].index)
    temp = [date,event_count]  
    pre_df_list.append(temp)
其中列表
pre_df_list
稍后转换为数据帧

这种方法很慢,看起来不雅观,但我正在努力寻找一种有效的方法

我认为应该是这样的:

map(lambda x,y: True if x > y else False, df['Event Date'],date_list)
但这会比较列表中的每一项,这不是我想要的


我意识到当我有工作代码时寻求帮助可能会很奇怪,但我正试图减少对循环的依赖,因为它们目前对我来说有点像拐杖。此外,我有多个不同的事件要在完整数据中跟踪,每个事件循环1000个日期的速度会令人不满意。

除非我误解了您的目标,否则在我看来,您可以简单地使用pandas DataFrames的能力与单个值进行比较,并像这样分割数据帧:

>>> df = pd.DataFrame({'event_date': [date(2020,9, 1), date(2020, 9, 2), date(2020, 9, 3)]})
>>> df
   event_date
0  2020-09-01
1  2020-09-02
2  2020-09-03
>>> df[df.event_date > date(2020, 9, 1)]
   event_date
1  2020-09-02
2  2020-09-03
使用
groupby()

from datetime import date, timedelta
import random
import pandas as pd 

# example data
dates = [date(2020, 1, 1) + timedelta(days=random.randrange(1, 100, 1)) for _ in range(1000)]
df = pd.DataFrame({'Event Date': dates})

# count events <= t
event_counts = df.groupby('Event Date').size().cumsum().reset_index()
event_counts.columns = ['Date', 'Events']
event_counts


          Date  Events
0   2020-01-02      13
1   2020-01-03      23
2   2020-01-04      34
3   2020-01-05      42
4   2020-01-06      51
..         ...     ...
94  2020-04-05     972
95  2020-04-06     981
96  2020-04-07     989
97  2020-04-08     995
98  2020-04-09    1000


map
仍然是一个循环,为了提高效率通常
True如果否则False
没有任何意义。@juanpa.arrivillaga谢谢,我将编辑问题以反映这一点
lambda x,y:x>y
更可取
x>y
调用
x.\uu gt\uuu(self,y)
并返回
bool
。这与
相同。即使在您希望将“trueish”值设置为真正的布尔值的情况下,您也只需使用
bool()
。感谢您的回答,我想知道每个日期发生的事件的累计数量,因为多行可以具有相同的事件日期,我将编辑问题以使其更清晰,这非常有效,而且速度更快,谢谢
date_list = [date(2020, 1, 1) + timedelta(days=x) for x in range(150)]
date_df = pd.DataFrame({'Date': date_list})

merged_df = pd.merge(date_df, event_counts, how='left', on='Date')
merged_df.columns = ['Date', 'Events']

merged_df = merged_df.fillna(method='ffill').fillna(0)