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