Я пробовал таким образом,
temp= df.groupby('Location').apply(lambda x: ((x[x['Type']=='B']['Number']/x['Number'].sum())*100)).reset_index().rename(columns={'Number':'Proportion_B'})
temp=temp[['Location','Proportion_B']]
temp['Proportion_B']=temp['Proportion_B'].astype(str).str.replace('\.0','')+'%'
df=pd.merge(df,temp,how='left',on=['Location'])
Вывод:
Location Type Number Proportion_B
0 House A 4 20%
1 House B 1 20%
2 Garden A 3 40%
3 Garden B 2 40%
Объяснение:
- Сгруппируйте элементы по
Location
, затем разделитеобщее число только с B и сохраните этот результат. - Слияние временного результата с оригинальным df на основе
Location' using
left` merge.
Примечание: Строка2, строка 3 для получения того же образца вывода.