Python 熊猫cumsum+;计算多个列

Python 熊猫cumsum+;计算多个列,python,pandas,Python,Pandas,阿罗哈 我有以下数据帧 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(4

阿罗哈

我有以下数据帧

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)
现在,我要做的是,对超过或低于目标但在状态改变时重置的门店进行累计计数

我认为这将是最好的方法来做这件事(和许多变种),但这并没有重置计数器

s = df.groupby(['Stores','Weeks','Status'])['Status'].shift().ne(df['Status'])
df['Count'] = s.groupby(df['Stores']).cumsum()
我的逻辑是按我的相关列分组,然后做一个!=移位以重置累积和

当然,我已经搜索了很多不同的问题,但我似乎无法解决这个问题。有谁能向我解释一下解决这个问题的最佳方法是什么

我希望这里的一切都是清晰和可复制的。如果您需要任何其他信息,请告诉我

预期产量

  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

在创建密钥之后,请尝试使用
pd.Series.groupby()
cumsum

s=df.groupby('Stores')['Status'].apply(lambda x : x.ne(x.shift()).ne(0).cumsum())
df['Count']=df.groupby([df.Stores,s]).cumcount()+1

您的预期输出是什么?已编辑的问题=)!先生,你是个天才。快速提问,在我的头脑中(这可能是我无法让它工作的原因),我总是按周分组,为什么在这种情况下不需要这样做?@DataNearroil因为您的周对于每个商店都是唯一的,如果您按周分组,您将得到唯一的行,这意味着(商店+周)可以是示例df的唯一键。所以groupby不起作用了谢谢!最后一个问题为什么
.ne(0)
据我所知
x:x.ne(x.shift())
返回一个
true
false
boolean?@datanovel,就像一个编码样式:-)
s=df.groupby('Stores')['Status'].apply(lambda x : x.ne(x.shift()).ne(0).cumsum())
df['Count']=df.groupby([df.Stores,s]).cumcount()+1