2017-08-16 8 views
-1

user_id列とstart_dateend_date列のデータフレームがあります。パンダのユーザーに対する重複要求の数

私は、指定された時間間隔で各ユーザーのstart_dateとend_dateの重複数を見つける新しい列を作成します。

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

どのようなデータの例ですか? – White

+0

@White私はモックを追加しました – Anisotropic

答えて

1

、次は助けることはありません。

「ループなし」の場合、再帰を使用することを意図している場合は、次のことは役に立ちません。

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でグループ化します。

関連する問題