我的数据框包含user_id
列以及start_date
和end_date
列。
我想创建一个新列,它以给定的时间间隔查找每个用户的重叠start_dates和end_dates的数量。
有没有办法在不使用for循环的情况下执行此操作?
示例:
User | Start | End | Simultaneous Events
`0 user_x 2013-02-09 2013-02-11 2` <---- overlaps with row 2
`1 user_x 2013-06-06 2013-06-08 1`
`2 user_x 2013-02-10 2013-02-13 2`
`3 user_y 2014-01-06 2014-01-11 1`
`4 user_x 2014-01-06 2014-01-11 1`
答案 0 :(得分:1)
如果您要求使用智能算法快速解决问题,以下情况无济于事。
&#34;没有循环&#34;,如果您的意图是使用递归,以下是没有帮助的。
import pandas as pd
import numpy as np
df = pd.DataFrame([
[0,'user_x','2013-02-09','2013-02-11'],
[1,'user_x','2013-06-06','2013-06-08'],
[2,'user_x','2013-02-10','2013-02-13'],
[3,'user_y','2014-01-06','2014-01-11'],
[4,'user_x','2014-01-06','2014-01-11']])
df.columns = ['id','user','start','end']
merge_df = pd.merge(df, df, on=['user'], suffixes=['','_compare'])
merge_df['overlap'] = ((merge_df['start']>=merge_df['start_compare'])&(merge_df['start']<=merge_df['end_compare'])) | ((merge_df['end']>=merge_df['start_compare'])&(merge_df['end']<=merge_df['end_compare']))
result = merge_df[merge_df.overlap>0].groupby(['id','user','start','end']).agg({'id_compare':np.size}).reset_index()
结果如下
id user start end id_compare
0 0 user_x 2013-02-09 2013-02-11 2
1 1 user_x 2013-06-06 2013-06-08 1
2 2 user_x 2013-02-10 2013-02-13 2
3 3 user_y 2014-01-06 2014-01-11 1
4 4 user_x 2014-01-06 2014-01-11 1
只是旁注,为了更好地理解这一点,我建议你阅读sql,这将有所帮助。想法很简单。匹配具有相同用户ID(pd.merge)的所有行并确定它是否是重叠,最后按用户ID分组以计算重叠ID的出现。