熊猫:考虑以前的记录,如何计算变化的数量

时间:2018-06-12 14:02:23

标签: python pandas record counting

我有一个如下数据框:

import pandas as pd 
df = pd.DataFrame({"id":[1,1,1,1,1,1,2,2,2,2,3,3,3,3], 
                  "val":[0,1,1,0,1,0,0,1,0,1,0,0,0,1]})

    id  val
0    1    0
1    1    1
2    1    1
3    1    0
4    1    1
5    1    0
6    2    0
7    2    1
8    2    0
9    2    1
10   3    0
11   3    0
12   3    0
13   3    1

正如您所看到的,ID是重复的,我的值在0和1之间交替。我想以某种方式计算值从0切换到1的次数。例如像这样:

id  val
1    2
2    2
3    1

它不是1的计数,而是对于每个ID,val切换为0 - > 1的计数器次数。

4 个答案:

答案 0 :(得分:4)

使用diff

df.groupby('id').val.apply(lambda x : sum(x.diff().eq(1)))
Out[306]: 
id
1    2
2    2
3    1
Name: val, dtype: int64

答案 1 :(得分:2)

您可以执行以下操作:

>>> # To be more exact: (df['val'] == 1) & (df['val'].shift() == 0
>>> df['val'].diff().eq(1).groupby(df['id']).sum().astype(int)

id
1    2
2    2
3    1

一般来说,我希望尽可能避免使用groupby.apply(...)

答案 2 :(得分:1)

如果值始终为01,则需要按id进行分组,并跟踪差异何时为1

df.groupby('id')['val'].apply(lambda x: (x - x.shift() == 1).sum()).reset_index()


   id   val
0   1   2
1   2   2
2   3   1

答案 3 :(得分:0)

df['val1'] = df.groupby('id').shift(1)
df['tag']= df.val-df.val1
df['tag']=df['tag'].apply(lambda x: 1 if x==1 else 0)
df[['id','tag']].groupby('id').sum()

    tag
id     
1     2
2     2
3     1