Python 熊猫:如何根据以前的记录计算更改的数量

Python 熊猫:如何根据以前的记录计算更改的数量,python,pandas,record,counting,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

我有一个如下所示的数据帧:

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为0-->1的val切换的计数器次数。

如果值始终为
0
1
,则需要按
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

你可以这样做:

>>> # 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(…)
,如果可能的话。

使用
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

如果我想找到从0到任意整数的更改,该怎么办?@AnthonySun将更改为gt(0),但gt(0)也会将4-->5视为一个更改权限?我只想数到0-->+int.@AnthonySun,然后你需要sum((x==0)和(x.shift!=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