阿罗哈
我有以下数据帧
stores = [1,2,3,4,5]
weeks = [1,1,1,1,1]
df = pd.DataFrame({'Stores' : stores,
'Weeks' : weeks})
df = pd.concat([df]*53)
df['Weeks'] = df['Weeks'].add(df.groupby('Stores').cumcount())
df['Target'] = np.random.randint(400,600,size=len(df))
df['Actual'] = np.random.randint(350,800,size=len(df))
df['Variance %'] = (df['Target'] - df['Actual']) / df['Target']
df.loc[df['Variance %'] >= 0.01, 'Status'] = 'underTarget'
df.loc[df['Variance %'] <= 0.01, 'Status'] = 'overTarget'
df['Status'] = df['Status'].fillna('atTarget')
df.sort_values(['Stores','Weeks'],inplace=True)
这给了我以下信息
print(df.head())
现在,我要做的是对超过或低于目标值的商店进行累计计数,但当状态发生变化时会重新设置。在
我认为这是最好的方法来做这件事(和许多变种的这件事),但这并没有重置计数器。在
s = df.groupby(['Stores','Weeks','Status'])['Status'].shift().ne(df['Status'])
df['Count'] = s.groupby(df['Stores']).cumsum()
我的逻辑是根据我的相关专栏进行分组,然后做一个!=按shift键重置累计值
当然,我已经搜索了许多不同的问题,但我似乎不明白这一点。有谁能给我解释一下解决这个问题的最佳方法是什么?在
我希望这里的一切都是清晰和可复制的。如果您需要更多信息,请告诉我。在
预期产量
Stores Weeks Target Actual Variance % Status Count
0 1 1 430 605 -0.406977 overTarget 1
0 1 2 549 701 -0.276867 overTarget 2
0 1 3 471 509 -0.080679 overTarget 3
0 1 4 549 378 0.311475 underTarget 1 # Reset here as status changes
0 1 5 569 708 -0.244288 overTarget 1 # Reset again.
0 1 6 574 650 -0.132404 overTarget 2
0 1 7 466 623 -0.336910 overTarget 3
在按
cumsum
创建密钥后,尝试pd.Series.groupby()
相关问题 更多 >
编程相关推荐