pandas中用户的重叠请求数

时间:2017-08-16 02:42:21

标签: python pandas datetime dataframe

我的数据框包含user_id列以及start_dateend_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`

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的出现。