Блок данных Pandas находит первый и последний элемент при заданном условии и вычисляет наклон - PullRequest
0 голосов
/ 10 ноября 2018

Ситуация :

У меня есть датафрейм pandas, где у меня есть некоторые данные о производстве продукта. Продукт производится в 3 этапа. Фазы не фиксированы, что означает, что их циклы (время до последнего) меняется. На каждом этапе производства измеряется температура продукта.

Пожалуйста, смотрите таблицу ниже:

enter image description here

Проблема :

Мне нужно рассчитать наклон для каждого цикла каждой фазы для каждого продукта. Мне также нужно добавить его в фрейм данных в новом столбце под названием «Наклон». Тот, который вы видите, выделенный желтым цветом, был добавлен мной вручную в файл Excel. Реальный набор данных содержит сотни параметров (не только температуры), поэтому на самом деле мне нужно вычислить наклон для множества столбцов, поэтому я попытался определить функцию.

Мое решение не работает вообще :

Это код, который я пробовал, но он не работает. Я пытаюсь поймать первый и последний ряд для данного продукта, для данного этапа. А затем получить данные о температуре и разницу этих двух строк. И так я мог рассчитать наклон. Это все, что я мог придумать (я создал еще один столбец с именем «Max_cylce_no», в котором хранится максимальное количество циклов для каждой фазы):

temp_at_start=-1

def slope(col_name):
    global temp_at_start
    start_cycle_no = 1
    if row["Cycle"]==1:
        temp_at_start =row["Temperature"]
        start_row = df.index(row)


    cycle_numbers = row["Max_cylce_no"] 
    last_cycle_row = cycle_numbers + start_row


    last_temp = df.loc[last_cycle_row, "Temperature"]

И как бы я хотел это применить:

df.apply(slope("Temperature"), axis=1)

К сожалению, я сразу же получаю NameError, сообщая, что: имя 'row' не определено.

Не могли бы вы помочь мне и показать правильное направление, как решить эту проблему. Это дает мне действительно тяжелое время. (

Заранее спасибо!

1 Ответ

0 голосов
/ 10 ноября 2018

Я считаю, что вам нужно GroupBy.transform с вычитанием последнего значения первым и делением на длину:

f = lambda x: (x.iloc[-1] - x.iloc[0]) / len(x)
df['new'] = df.groupby(['Product_no','Phase_no'])['Temperature'].transform(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...