我正在尝试运行一个简单的计数功能,该功能运行事件时间(特别是手术)的数据帧与另一个移位时间帧的数据帧,并返回每个班次期间发生的事件数量的列表。但是,这些csvs是成千上万行,所以虽然我设置它的方式目前有效,但它需要永远。这就是我所拥有的:
numSurgeries = [0 for shift in range(len(df.Date))]
for i in range(len(OR['PATIENT_IN_ROOM_DTTM'])):
for shift in range(len(df.DateTime)):
if OR['PATIENT_IN_ROOM_DTTM'][i] >= df.DateTime[shift] and OR['PATIENT_IN_ROOM_DTTM'][i] < df.DateTime[shift+1]:
numSurgeries[shift] += 1
因此它循环遍历每个事件并检查它所处的移位时间帧,然后递增该时间帧的计数。逻辑,有效,但绝对没有效率。
编辑:
答案 0 :(得分:0)
如果没有示例数据,那么你想要的并不是很清楚。但这应该可以帮助你进行矢量化:
numSurgeries = {shift: np.sum((OR['PATIENT_IN_ROOM_DTTM'] >= df.DateTime[shift]) & \
(OR['PATIENT_IN_ROOM_DTTM'] < df.DateTime[shift+1])) \
for shift in range(len(df.Date))}
输出是一个字典映射整数转换为numSurgeries。
答案 1 :(得分:0)
如上所述,没有示例数据很难回答。
然而,布尔掩码听起来很合适。请参阅Select dataframe rows between two dates。
从shift
创建日期掩码,我们将分别调用开始和结束日期start_shift
和end_shift
。这些应该是datetime
格式。
date_mask = (df['datetime'] >= start_shift) & (df['datetime'] <= end_shift)
找到符合此范围的df
中的所有值。
df_shift = df.loc[date_mask]
计算新df_shift
中的实例数。
num_surgeries = len(df_shift.index())
循环所有轮班。
def count_shifts(df, shift, results_df, start_shift, end_shift):
date_mask = (df['datetime'] >= start_shift) & (df['datetime'] <= end_shift)
df_shift = df.loc[date_mask]
num_surgeries = len(df_shift.index())
return(num_surgeries)
# iterates through df and applies the above function to every row
results_df['num_surgeries'] = results_df.apply(calculate_num_surgeries,axis=1)
还记得根据PEP8 Style Guide命名变量! Python不建议使用Camelcase。