2016-11-17 57 views
1

我有一个像下面一个数据帧:添加连续行,如果他们匹配一些列

ID URL  seconds 
1 Email  9 
1 Email  3 
1 App   5 
1 App   9 
1 Faceboook 50 
1 Faceboook 7 
1 Faceboook 39 
1 Faceboook 10 
1 Email  39 
1 Email  5 
1 Email  57 
1 Faceboook 7 
1 Faceboook 32 
1 Faceboook 3 
2 App   11 
2 App   10 
2 Email  56 
2 Faceboook 9 
2 Faceboook 46 
2 Faceboook 16 
2 Email  21 

我要总结对于因同一ID同一URL的连续欣赏到“秒”列。这就是我正在寻找的结果:

ID URL  seconds 
1 Email  12 
1 App   14 
1 Faceboook 106 
1 Email  101 
1 Faceboook 42 
2 App   21 
2 Email  56 
2 Faceboook 71 
2 Email  21 

df.groupBy(['ID', 'URL']).sum()不会在这种情况下工作,因为它会总结相同的URL的所有情况下,同一个ID,不仅是连续的。

任何想法?

回答

3

您可以通过创建Series使用groupbyneURL比较和转移,最后使用cumsumboolean mask

print ((df.URL.ne(df.URL.shift())).cumsum()) 
0  1 
1  1 
2  2 
3  2 
4  3 
5  3 
6  3 
7  3 
8  4 
9  4 
10 4 
11 5 
12 5 
13 5 
14 6 
15 6 
16 7 
17 8 
18 8 
19 8 
20 9 
Name: URL, dtype: int32 
print (df['seconds'].groupby([(df.URL.ne(df.URL.shift())).cumsum(), df.ID, df.URL]).sum()) 

URL ID URL  
1 1 Email   12 
2 1 App   14 
3 1 Faceboook 106 
4 1 Email  101 
5 1 Faceboook  42 
6 2 App   21 
7 2 Email   56 
8 2 Faceboook  71 
9 2 Email   21 
Name: seconds, dtype: int64 

print (df['seconds'].groupby([(df.URL.ne(df.URL.shift())).cumsum(), df.ID, df.URL]) 
        .sum() 
        .reset_index(level=0, drop=True) 
        .reset_index()) 

    ID  URL seconds 
0 1  Email  12 
1 1  App  14 
2 1 Faceboook  106 
3 1  Email  101 
4 1 Faceboook  42 
5 2  App  21 
6 2  Email  56 
7 2 Faceboook  71 
8 2  Email  21 
+0

我想你也需要处理'1的Facebook的情况下, ; 2 Facebook“。 –

+0

@JohnZwinck - 我不明白,你能解释一下吗? – jezrael

+0

没关系,我认为你的代码实际上处理这种情况。好一个。 –

相关问题