在过去的几个小时里都试图解决这个问题,但是没有运气。
我有一个数据框,如下所示:
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
(如果这没有遇到一个最低限度的问题,请告诉我)。
答案 0 :(得分:2)
我认为使用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
答案 1 :(得分:1)
使用申请:
{
"advertiserId":"someID"
}