在过去的几个小时里一直在努力解决这个问题,但是没有运气。

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

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


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

最佳答案

我认为使用diff获取或不更改值,然后我们需要通过groupby将另一个cumsum更改为ID

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

10-01 22:51
查看更多