相邻行熊猫的分组条件总和
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 次) .以上是关于相邻行熊猫的分组条件总和的主要内容,如果未能解决你的问题,请参考以下文章