通过ID和周数计算单列滚动变化

时间:2019-03-26 14:30:12

标签: python pandas

在过去的几个小时里都试图解决这个问题,但是没有运气。

我有一个数据框,如下所示:

id = [1,1,1,2,2,2]
weeks = [1,2,3,1,2,3]
contr = [16,16,22,37,37,16]


df = pd.DataFrame({'ID' : id,
             'Week' : weeks,
             'Contract' : contr})

print(df)
   ID  Week Contract
0   1   1   16
1   1   2   16
2   1   3   22
3   2   1   37
4   2   2   37
5   2   3   16

现在我要尝试的是在给定的一周内按ID计算合同的更改次数(我的df很小,大约有180万行)

所以我认为可以的工作是对一个值进行滚动计数,该值不等于我尝试使用此代码尝试过的值:

df['count'] = df['ID'].groupby((df['Contract'] != df['Contract'].shift(-1)).cumsum()).cumcount()

但这不能给我想要的结果,

我追求的是类似以下内容

    print(df)
   ID  Week Contract count
0   1   1   16       0   # First instance is this is ignored 
1   1   2   16       0   # No Change so 0
2   1   3   22       1   # Change here so 1
3   2   1   37       0
4   2   2   37       0
5   2   3   16       1
6   2   4   16       0  # This should be 0 as the change was in the prev Week

(如果这没有遇到一个最低限度的问题,请告诉我)。

2 个答案:

答案 0 :(得分:2)

我认为使用diff来获取或不更改值,那么我们需要另外groupbycumsumID

s=df.groupby('ID').Contract.diff().ne(0)
s.groupby(df['ID']).cumsum()-1
Out[33]: 
0    0.0
1    0.0
2    1.0
3    0.0
4    0.0
5    1.0
Name: Contract, dtype: float64
df['Count']=s.groupby(df['ID']).cumsum()-1

答案 1 :(得分:1)

使用申请:

{
"advertiserId":"someID"
}