Я создал уникальный идентификатор для двух разных «стеков» в вашей таблице, а затем использовал этот идентификатор как индекс merge
. Pandas добавит суффикс, чтобы ваши имена были уникальными. Затем вы можете выполнить простое вычитание:
df = pd.DataFrame({'name':['Strain A', 'Strain B', 'Strain C', 'Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B', 'Strain C', 'Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B',],
'Buffer':['PBS', 'PBS', 'PBS', 'Tris', 'Tris', 'Tris', 'Phos','Phos','Phos','PBS', 'PBS', 'PBS', 'Tris', 'Tris', 'Tris', 'Phos','Phos'],
'Time' :[2,2,2,2,2,2,2,2,2,20,20,20,20,20,20,20,20],
'%':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
}).set_index('name')
df["unique"] = df.index + "_" + df["Buffer"]
df1 = df[df["Time"]==2]
df2 = df[df["Time"]==20]
df3 = pd.merge(df1,df2,left_on='unique',right_on='unique',how='inner')
df3["Diff"] = df3["%_y"] - df3["%_x"]
Вероятно, есть более короткий и умный способ, но он, вероятно, более поучителен.
EDIT:
Чтобы учесть недостающие данные , вы можете выбрать how='outer'
, который заполнит NaN там, где есть пропущенные значения, а затем использовать
df3 = df3.fillna(0.0)
перед вычитанием