2016-04-29 5 views
1

Я пробовал длинный длинный час, чтобы сделать это, но я застрял. У меня есть много машин, которые производят коробки, каждая коробка содержит элементы. Все предметы, коробки серийно помечены.Последовательность появления нескольких учетных записей

Я хочу создать подсчет последовательности, основанный на box_sn, как результат изображения.

Я хочу, чтобы решение pandas dataframe или формула excel. могут ли какие-нибудь эксперты дать мне подсказки, чтобы решить это? спасибо.

enter image description here

отредактирован: я могу генерировать номер последовательности на основе одиночных catergories как на рисунке ниже. с формулой: G2 = IF (B2 <> B1, G1 + 1, G1) это продолжит последовательность box_sn, но я хочу, чтобы машина B box_sn перезапустила последовательность. enter image description here

отредактировано 2: Это окончательный результат моего temp_reading. Большое спасибо. enter image description here

+0

Помогло ли вам это? http://stackoverflow.com/a/36652577/5276797 – IanS

+0

Вы, кажется, просите кого-нибудь написать код для вас. Переполнение стека - это вопрос и ответ, а не служба написания кода. Пожалуйста, [см. Здесь] (http://stackoverflow.com/help/how-to-ask), чтобы узнать, как писать эффективные вопросы. – DSM

+0

Я действительно прошу предложения в алгоритме, чем стиль кодирования. формула excel - это ОКИ, и я могу перевести код или загрузить вычисленный файл в dataframe. Спасибо за напоминание. – pinky

ответ

1

На основе вашего редактирования, раствор Excel будет (вводится в колонку F):

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

спасибо, сэр! простой и надменный !!! – pinky

+0

Почему бы не начать прямо с 1 для строки 1, а затем (строка 2 вниз) '= F1 * (A2 = A3) + (B2 = B3)'? –

+0

@DirkReichel, в котором ячейка? F2? – ayhan

0

Похоже, после прочтения данных с помощью

df = pd.read_excel(path) 

вы могли бы сделать:

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

IIUC и ваша цель состоит в том, чтобы получить количество элементов в box_sn?

+0

моей целью является построение тепловой карты, такой как shmoo plot на temp_reading. независимо от box_sn, я хочу выровнять по нему последовательность. новые столбцы последовательности помогают в построении графика. – pinky

+0

df.groupby ('box_sn'). Size() для меня подсчитывает items_sn. Мне нужно индивидуальное значение temp_reading – pinky

+0

@pinky вы все еще интересуетесь решением pandas? – IanS

2

С пандами:

Первый, создать фрейм данных:

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.)

Третий, применять выше всего dataframe через 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 

Четвертый, мы необходимо отбросить первый уровень индекса (A, B), прежде чем мы включим результат в исходный фрейм данных:

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

Вчера я провел почти час, чтобы найти решение Панды без везения. Иногда я пропускаю электронные таблицы. :) – ayhan

+0

очень интуитивно понятный, я на самом деле тестирую его с прошлой ночи. Я работал над несколькими категориями, например, не только с машиной, но и с машиной и фабрикой, машиной, фабрикой, страной – pinky

Смежные вопросы