多个事件的发生顺序

我已经尝试了很长时间来做到这一点,但我卡住了。 我有很多机器生产箱子,每个箱子都包含物品。 所有的物品,箱子都被串行标记。

我想在图片中产生基于box_sn的序列计数。

我希望pandasdataframe解决scheme或与excel公式。 任何专家都可以给我一个提示来解决这个问题吗? 谢谢。

在这里输入图像说明

编辑:我可以生成基于单个代码的序列号,如下图所示。 用公式:G2 = IF(B2 <> B1,G1 + 1,G1),这将继续序列box_sn,但我希望机器B box_sn重新启动序列。 在这里输入图像说明

编辑2:这是我的temp_reading的最终结果。 非常感谢你。 在这里输入图像说明

根据您的编辑,Excel解决scheme将被input(在F栏中input):

=IF(A2<>A1,1,IF(B2=B1,F1,F1+1)) 

随着pandas:

首先 ,创build数据框架:

 import pandas as pd df = pd.DataFrame({ 'machine': ['A','A','A','A','B','B','B','B','B','B'], 'box_sn': ['A3','A3','A5','A5','B1','B1','B2','B2','B3','B3'], 'item_sn': ['i1','i2','i3','i4','i1','i2','i3','i4','i5','i6'] }) 

其次 ,用一台机器(这里是B )工作:

 dfB = df[df.machine == 'B'] (dfB['box_sn'].shift() != dfB['box_sn']).cumsum() 

每次盒子序列号改变时, cumsum都会增加 – 这就是你想要的。 (这是假设序号是有序的,否则你可以使用sort_values 。)

第三 ,通过groupby将以上应用于整个dataframe:

 def sequence(df1): return (df1['box_sn'].shift() != df1['box_sn']).cumsum() df_sequence = df.groupby('machine').apply(sequence) 

这是输出(我们差不多):

 In [17]: df_sequence Out[17]: machine A 0 1 1 1 2 2 3 2 B 4 1 5 1 6 2 7 2 8 3 9 3 

第四 ,在将结果包含在原始数据框之前,我们需要删除索引的第一级( AB ):

 df_sequence.index = df_sequence.index.droplevel(0) df['sequence'] = df_sequence 

听起来像是在读完你的数据之后

 df = pd.read_excel(path) 

你可以这样做:

 df.groupby('box_sn').size() 

IIUC和你的目标是获得每box_sn项目的数量?