【问题标题】:sequence of occurrence by multiple catergories多个类别的发生顺序
【发布时间】:2016-04-30 22:33:00
【问题描述】:

我已经尝试了很长时间来做到这一点,但我卡住了。 我有很多机器生产盒子,每个盒子都包含物品。 所有物品、盒子都带有序列标签。

我想生成基于 box_sn 的序列计数作为图片中的结果。

我希望熊猫数据框解决方案或 Excel 公式。任何专家可以给我一个提示来解决这个问题吗? 谢谢。

编辑: 我能够根据单个类别生成序列号,如下图所示。 公式:G2 = IF(B2B1,G1+1,G1) 这将继续对 box_sn 进行排序,但我希望机器 B box_sn 重新启动序列。

编辑 2: 这是我的 temp_reading 的最终结果。非常感谢您。

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/a/36652577/5276797
  • 您似乎在要求某人为您编写一些代码。 Stack Overflow 是一个问答网站,而不是代码编写服务。请see here学习如何写出有效的问题。
  • 我实际上是在寻求算法方面的建议,而不是编码风格。 excel公式没问题,我可以翻译代码或将计算的文件加载到数据框中。谢谢你的提醒。
  • @IanS,感谢您的链接,它帮助我尝试使用 pandas 系列方法再次构建数据框。谢谢。

标签: python excel pandas


【解决方案1】:

使用熊猫:

首先,创建数据框:

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将上述应用到整个数据框:

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

【讨论】:

  • 我昨天花了将近一个小时才找到 Pandas 解决方案,但没有成功。我有时会想念电子表格。 :)
  • 非常直观,我从昨晚开始实际测试它。我正在研究多个类别,例如不仅是机器,还有机器和工厂、机器、工厂、国家
【解决方案2】:

根据您的编辑,Excel 解决方案将是(在 F 列中输入):

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

【讨论】:

  • 为什么不直接从第 1 行的 1 开始,然后(第 2 行向下)=F1*(A2=A3)+(B2=B3)
  • @DirkReichel 在哪个单元格中? F2?
  • 哦...等等...第1行是标题...=F2*(A3=A4)+(B3=B4)F3开始,在F2直接输入1:P
【解决方案3】:

听起来像,在使用读取数据之后

df = pd.read_excel(path)

你可以这样做:

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

IIUC,您的目标是获取每个 box_sn 的项目数?

【讨论】:

  • 我的目标是在 temp_reading 上绘制一个类似于 shmoo 的热图。不管box_sn如何,我都想按它的顺序对齐盒子。新的序列列有助于绘图。
  • df.groupby('box_sn').size() 对我来说是计算 items_sn。我需要单独的 temp_reading 值
  • @pinky 你还对 pandas 解决方案感兴趣吗?
  • @IanS ,答案是肯定的。我仍在尝试如何操作数据框以生成 seq 列。任何提示? ^.^
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2021-10-16
相关资源
最近更新 更多