Рассмотрим следующий кадр данных:
tdf=pd.DataFrame({'City':['NY','NY','NY','NY','NY','CA','CA','CA','CA','CA','CA'],'PRJ':['A','B','C','D','E','F','GG','GG','I','J','K'],'Year':[2011,2012,2013,2014,2015,2011,2012,2012,2013,2014,2015],'EXPECTED':[2,3,4,6.1,7,7.1,8,3,10,11,11],'ACTUAL':[0.5,1.8,2.7,5.1,5.8,6.8,10,10,8,8.1,8.2]})

Моя цель - добавить ratio=actual/expected.
Если бы у меня не было проекта GG, это было бы тривиально:
tdf['Ratio']=tdf['ACTUAL']/tdf['EXPECTED']

Учитывая этот вызов, я хочу добавить еще один столбец ACTUAL_ADJUSTED , где я 'pro-rate' ACTUAL , например так:
prj_ratio = 10/(8+3) = 0.909
gg6_actual = (0.909*8)=7.272
gg7_actual = (0.909*3)=2.727
Что я пробовал?
Я построил функцию
def make_adjustments(r):
s = tdf[(tdf['City']==r['City']) & (tdf['Year']==r['Year']) ]
if len(s)>1:
return "problem here"
else:
return 'ok'
tdf['ACTUAL_ADJUSTED'] = tdf.apply(make_adjustments,axis=1)
Эта функция будет определять проблему, но в действительности (по моим реальным данным) это занимает значительное время. Поэтому я пришел к выводу, что я не на правильном пути. Есть идеи, как решить это правильно?