pivot_table
является возможным решением:
i = df.melt('TARGET')
j = i.pivot_table(
index='TARGET', columns=['variable', 'value'], aggfunc='size', fill_value=0
)
print(j)
variable FLAG_OWN_CAR FLAG_OWN_REALTY
value N Y N Y
TARGET
0 0 2 1 1
1 1 1 1 1
Теперь, для второй части с% s, вы можете разделить на сумму (как @jezraelсделано):
j.div(j.sum(axis=1), axis=0).astype(str).add('%')
variable FLAG_OWN_CAR FLAG_OWN_REALTY
value N Y N Y
TARGET
0 0.0% 0.5% 0.25% 0.25%
1 0.25% 0.25% 0.25% 0.25%