Pandas中每个用户名的并发事件数



我有一个类似于下面的表,但大约有700万行。我想知道的是每个用户同时处理多少个案例?我想按用户名分组,然后获得两次之间并发打开的引用数量的平均计数。

tbody> <<tr>245
Reference starttime stoptime Username
12020-07-28 06:41:56.0002020-07-28 07:11:25.000亚瑟
2020-07-18 13:24:02.0002020-07-18 13:38:42.000亚瑟
32020-07-03 09:27:03.0002020-07-03 10:35:24.000亚瑟
2020-07-05 19:42:38.0002020-07-05 20:07:52.000鲍勃
2020-07-04 10:22:48.0002020-07-04 10:24:32.000鲍勃

昨天有人问了一个类似的问题,所以这里是:

ends = df['starttime'].values < df['endtime'].values[:, None]
starts = df['starttime'].values > df['starttime'].values[:, None]
same_name = (df['Username'].values == df['Username'].values[:, None])
# check for rows where all three conditions are met
# count the nubmer of matches by sum across axis=1 !!!
df['overlap'] = (ends & starts & same_name).sum(1)
df

要回答你最后的平均值问题,你可以运行:

df['overlap'].mean()

我将使用Pandas的groupby函数,正如您在标签中已经建议的那样,通过用户名。下面让我来描述一下每个分组用户的一般工作流程:

  • 收集所有开始时间和停止时间作为"活动的变化时刻"。
  • 在你的分组数据框中循环遍历它们
  • 使用pandas . datafframe .loc来检查在变化时刻有多少例是"活动的"。
  • 将这些保存在列表中以计算平均病例数

我没有你的代码,但是在伪代码中它看起来像:

df = ...  # your raw df
grouped = df.groupby(by='Username')
for user, user_df in grouped:
cases = []
user_starts_cases = user_df['starttime'].to_numpy()
user_stops_cases = user_df['stoptime'].to_numpy()
times_of_activity_changes = np.concatenate(user_starts_cases, user_stops_cases)

for xs in times_of_activity_changes:
num_activities = len(user_df.loc[(user_df['starttime'] <= xs) & (user_df['stoptime'] >= xs)])  # mind the brackets
active_cases.append(num_activities)

print(sum(active_cases)/len(active_cases))

这取决于你所说的"平均",但有了这个,你可以在你感兴趣的时候对活跃案例的数量进行抽样,并计算平均值。

相关内容

  • 没有找到相关文章

最新更新