Вы можете использовать melt + кросс-таблица + слияние :
m1 = df1.melt(id_vars=['Grp'])
m2 = df2.melt(id_vars='Grp')
m2[['group', 'variable']] = m2.variable.str.split('_', expand=True)
cross = pd.crosstab(index=[m2['Grp'], m2.variable], columns=m2.group,
values=m2['value'], aggfunc='sum').reset_index()
result = m1.merge(cross, on=['Grp', 'variable'])
result['evaluation'] = (result['value'] <= result.Upper) & (result['value'] >= result.Lower)
print(result)
Выход
Grp variable value Lower Upper evaluation
0 Men A 10 1 10 True
1 Women A 4 4 6 True
2 Baby A 3 3 5 True
3 Men B 15 2 9 False
4 Women B 6 4 10 True
5 Baby B 5 7 15 False
6 Men C 14 2 15 True
7 Women C 5 3 10 True
8 Baby C 15 3 6 False