在Pandas中添加连续行(如果它们在某些列上匹配

时间:2016-11-17 13:48:36

标签: python pandas

我有一个类似下面的数据框:

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的情况求和,而不仅仅是连续的。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您可以按SeriesURL进行比较后创建的boolean mask使用groupby,并使用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 转移,上次使用ne:< / p>

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  
Expression.Sql("{alias}.Column LIKE ?", $"%{stringValue}%", NHibernateUtil.String);
相关问题