熊猫数据框找到给定条件的第一个和最后一个元素并计算斜率

时间:2018-11-10 19:19:58

标签: python pandas dataframe

情况

我有一个熊猫数据框,其中有一些有关产品生产的数据。该产品分三个阶段生产。阶段不是固定的,这意味着它们的周期(到最后的时间)正在改变。在生产阶段,在每个循环中都要测量产品的温度。

请参见下表:

enter image description here

问题

我需要为每种产品的每个阶段的每个周期计算斜率。我还需要将其添加到名为“ Slope”的新列中的数据框中。您可以看到的黄色突出显示的内容是我手动在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 :(得分:2)

我相信您需要GroupBy.transform,并用第一个值减去最后一个值并除以长度:

f = lambda x: (x.iloc[-1] - x.iloc[0]) / len(x)
df['new'] = df.groupby(['Product_no','Phase_no'])['Temperature'].transform(f)