Pandas:根据条件计数进行分组

4

我正在尝试在Pandas(Python2.7)中根据一个递增的计数来分组数据框,该计数每当不再满足条件时就会重置。代码如下:

date                      condition        count   
01,01,2018 08:00             A               1
01,01,2018 08:01             A               2
01,01,2018 08:03             A               3
01,01,2018 08:04             B               1
01,01,2018 08:07             B               2
01,01,2018 08:10             B               3
01,01,2018 08:13             B               4
01,01,2018 08:14             C               1
01,01,2018 08:16             C               2
01,01,2018 08:18             C               3
01,01,2018 08:20             C               4
01,01,2018 08:21             C               5
01,01,2018 08:22             A               1
01,01,2018 08:24             A               2
01,01,2018 08:25             B               1
01,01,2018 08:27             B               2
01,01,2018 08:29             B               3
01,01,2018 08:30             C               1

我想要获得:

date                      condition        count   
01,01,2018 08:00             A               3
01,01,2018 08:04             B               4
01,01,2018 08:14             C               5
01,01,2018 08:22             A               2
01,01,2018 08:25             B               3
01,01,2018 08:30             C               1

如您所见,仅按A、B、C分组是不可能的,因为分组取决于条件是否发生变化,而不是条件本身。这就是为什么我创建了计数器,可以帮助实现此目的。我尝试过df2=df.groupby(['condition', 'date']).where(df['count']<df['count'].shift(1)for循环……但我会遇到语法错误、定义错误、键错误或“无法访问'DataFrameGroupBy'对象的可调用属性'where',请尝试使用'apply'方法”等错误,具体取决于尝试的方法。
我希望您中的一些人能够建议如何解决这个问题,提前感谢您。
1个回答

6

通过使用shift方法的比较值(使用ne,表示不等于)创建帮助程序Series,然后使用cumsum进行聚合,最后使用agg,用firstlast进行汇总:

g = df['condition'].ne(df['condition'].shift()).cumsum()
d = {'date':'first', 'condition':'first','count':'last'}
df = df.reset_index().groupby(g, as_index=False).agg(d)
print (df)
               date condition  count
0  01,01,2018 08:00         A      3
1  01,01,2018 08:04         B      4
2  01,01,2018 08:14         C      5
3  01,01,2018 08:22         A      2
4  01,01,2018 08:25         B      3
5  01,01,2018 08:30         C      1

还有一件事:如果现在我需要向刚刚形成的分组中添加来自df的其他列,对它们执行求和、平均值等操作,该如何添加呢?谢谢。 - Luca91
1
@LucaSignoria - 然后将其添加到字典中,例如 d = {'date':'first', 'condition':'first','count':'last', 'col':'sum', 'another col':'mean'} - jezrael

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