Pandas之相邻行分组条件求和

10

我有一个数据帧,已经按用户和时间排序

 df = pd.DataFrame({'user' : ['A', 'A', 'A', 'B', 'B', 'B','B'],
              'location' : ['house','house','gym','gym','shop','gym','gym'], 
              'duration':[10,5,5,4,10,4,6]})


   duration location user
0        10    house    A
1         5    house    A
2         5      gym    A
3         4      gym    B
4        10     shop    B
5         4      gym    B
6         6      gym    B

我只想在给定用户的相邻行中,“位置”字段相同时执行sum()。因此,不仅仅是df.groupby(['id','location']).duration.sum()。期望的输出如下所示。此外,顺序很重要。

duration location user
      15    house    A
       5      gym    A
       4      gym    B
      10     shop    B
      10      gym    B

谢谢!

1个回答

14

提供sort=False以保留分组之间在原始DF中出现的顺序。然后,计算duration列的分组总和。

adj_check = (df.location != df.location.shift()).cumsum()
df.groupby(['user', 'location', adj_check], as_index=False, sort=False)['duration'].sum()

你之前尝试过的唯一变化是这个条件,它将所有相似的连续行分为一个唯一的组:




enter image description here

(df.location != df.location.shift()).cumsum()
0    1
1    1
2    2
3    2
4    3
5    4
6    4
Name: location, dtype: int32

如何确保顺序的正确性?例如,对于用户A而言,聚合表中应该首先是房屋,然后是健身房。 - user42361
我编辑了我的帖子,请看一下这是否是你想要做的。 - Nickil Maveli
1
这看起来很棒!非常感谢你! - user42361
当您执行df.location.shift()时,它将所有值向下移动一个级别。我们这样做是为了将我们当前的值与之进行比较的估计。每当df.locationdf.location.shift()下的值匹配时,(df.location != df.location.shift())返回False。因此,只要相同的值重复出现N次,我们就会得到(N-1)个False返回。 - Nickil Maveli
1
接下来,我们需要确保它们属于一个独立的组。因此,需要将它们的cumsum设置为False,这将计算为0,无论有多少个这样的False值存在,它们仍将导致1。(1+0+0+...N次)。 - Nickil Maveli
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接