【问题标题】: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

谢谢!

【问题讨论】:

    标签: python pandas conditional


    【解决方案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 次) .
    猜你喜欢
    • 2017-02-06
    • 2021-04-24
    • 2020-01-25
    • 2019-05-20
    • 2020-10-12
    • 1970-01-01
    • 2017-01-30
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多