我有一个如下所示的数据框:
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()
在这种情况下不起作用,因为它会将相同 ID 的相同 URL 的所有情况相加,而不是仅连续的。
有什么想法吗?
最佳答案
您可以使用groupby
由 Series
创建,由 ne
进行比较列 URL
并移动,上次使用 cumsum
使用 bool 掩码:
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
关于python - 如果连续行在某些列上匹配,则在 Pandas 中添加连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40656632/