我有一个类似于下面的表,但大约有700万行。我想知道的是每个用户同时处理多少个案例?我想按用户名分组,然后获得两次之间并发打开的引用数量的平均计数。
Reference | starttime | stoptime | Username | 1 | 2020-07-28 06:41:56.000 | 2020-07-28 07:11:25.000 | 亚瑟 | 2
---|---|---|---|
2020-07-18 13:24:02.000 | 2020-07-18 13:38:42.000 | 亚瑟 | |
3 | 2020-07-03 09:27:03.000 | 2020-07-03 10:35:24.000 | 亚瑟 |
2020-07-05 19:42:38.000 | 2020-07-05 20:07:52.000 | 鲍勃 | |
2020-07-04 10:22:48.000 | 2020-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))
这取决于你所说的"平均",但有了这个,你可以在你感兴趣的时候对活跃案例的数量进行抽样,并计算平均值。