我目前正在重构一些旧代码。代码的一部分通过一个很大的网页活动数据框进行迭代,该数据框通常如下所示:
Index | User | Time | Session_name | Session_num
1, ABC, 11:52, "", ""
2, ABC, 12:31, "", ""
3, DEF, 7:30, "", ""
4, DEF, 12:30, "", ""
....
当前代码如下:
x = 60 # number of minutes between two interactions that are considered same session
session_ID = df['User'][0] + df['Time'][0]
session_num = 1
for i in df.index[1:]:
if(df['User'][i-1] == df['User'][i]) & ((df['Time'][i] -df['Time'][i-1]) < x):
df.loc[i, 'session_name'] = session_ID
df.loc[i, 'session_number'] = session_num
else:
session_ID = CombinedGALogDF['User_ID'][i] + "," + CombinedGALogDF['Timestamp'][i]
session_num += 1
df.loc[i, 'session_name'] = session_ID
df.loc[i, 'session_number'] = session_num
此代码完成的功能:遍历用户执行的所有动作并将其标记为会话(定义为同一用户的所有动作,并且它们之间没有60分钟以上的间隔)。例如,如果用户ABC单击11:01、11:52和12:43的链接,这些链接都将属于同一会话,并应标记为“ ABC 11:01”。我不清楚如何在不遍历每一行的情况下重新创建此链接名称效果
主要问题是,这花费了将近10分钟,并且有多个类似的代码块。我读了一些书后发现,遍历熊猫数据框的行是执行此类操作的最慢方法。我解决此问题的第一个想法是创建两个临时列,其中“用户”和“时间”下移一个以方便比较。任何和所有帮助表示感谢,谢谢!