在过去的几个小时里一直在努力解决这个问题,但是没有运气。
我有一个数据框,如下所示:
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