Используйте GroupBy.transform
со средним значением логической маски, поэтому получите Series
с тем же размером, что и оригинал, поэтому можно перейти к np.where
для нового столбца:
df = pd.DataFrame({
'Occupation':list('dddeee'),
'Emp_Code':list('aabbcc'),
'Gender':list('MFMFMF')
})
print (df)
Occupation Emp_Code Gender
0 d a M
1 d a F
2 d b M
3 e b F
4 e c M
5 e c F
m = df['Gender'].eq('M')
df['new'] = np.where(m, m.groupby(df['Occupation']).transform('mean').mul(100), 0)
print (df)
Occupation Emp_Code Gender new
0 d a M 66.666667
1 d a F 0.000000
2 d b M 66.666667
3 e b F 0.000000
4 e c M 33.333333
5 e c F 0.000000
Если требуется новый DataFrame, заполненный нормированными значениями, возможно одно решение с параметрами crosstab
и normalize
:
df2 = pd.crosstab(df['Occupation'], df['Gender'],normalize='index')
print (df2)
Gender F M
Occupation
d 0.333333 0.666667
e 0.666667 0.333333