我有一个如下数据框:
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的计数器次数。
答案 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)
如果值始终为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
答案 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