多个事件的发生顺序
我已经尝试了很长时间来做到这一点,但我卡住了。 我有很多机器生产箱子,每个箱子都包含物品。 所有的物品,箱子都被串行标记。
我想在图片中产生基于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
第四 ,在将结果包含在原始数据框之前,我们需要删除索引的第一级( A
, B
):
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
项目的数量?