相邻行熊猫的分组条件总和

Posted

技术标签:

【中文标题】相邻行熊猫的分组条件总和【英文标题】:Groupby conditional sum of adjacent rows pandas 【发布时间】:2017-05-28 00:25:00 【问题描述】:

我有一个按用户和时间排序的数据框

 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】:

提供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()


需要对您之前尝试过的内容进行的唯一更改是这种条件,它将所有相似的连续行分组到一个唯一的组中:

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

【讨论】:

我认为 OP 想要在组内相邻?不清楚 正确,仅在“用户”组内相邻。我将编辑我的问题以使其更清楚。谢谢 我提出它是因为s 测试分组之外的邻接。可能没关系。我在想一个反例 这看起来很棒!非常感谢! (contd)...之后,我们需要确保它们本身属于不同的组。因此,需要将他们的cumsum 视为False 将评估为0,并且无论存在多少这样的False 值,它们仍然会导致1.(1+0+0+...N 次) .

以上是关于相邻行熊猫的分组条件总和的主要内容,如果未能解决你的问题,请参考以下文章

大熊猫中分组的条件比率

熊猫将行值除以聚合总和,条件由其他单元格设置

熊猫分组总和

熊猫:分组并根据条件在每个组中删除行

大熊猫分组并总和显示值

熊猫:设置列等于另一列的分组总和[重复]