情况:
我有一个熊猫数据框,其中有一些有关产品生产的数据。该产品分三个阶段生产。阶段不是固定的,这意味着它们的周期(到最后的时间)正在改变。在生产阶段,在每个循环中都要测量产品的温度。
请参见下表:
问题:
我需要为每种产品的每个阶段的每个周期计算斜率。我还需要将其添加到名为“ 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'未定义。
请您帮我一下,向我显示如何解决此问题的正确方向。这给了我一个非常艰难的时期。 :(
提前谢谢!
答案 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)