熊猫:根据条件计数进行分组

时间:2018-08-14 07:22:48

标签: python python-2.7 pandas

我试图将熊猫的数据框归为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',请尝试使用'应用“方法”,还有许多其他方法取决于尝试。

我希望你们中的一些人可以提出解决方案,谢谢。

1 个答案:

答案 0 :(得分:6)

创建辅助程序Series,将ne!=)的shift值与cumsum进行比较,然后agg与{{ 3}}和first

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