Один из подходов состоит в том, чтобы groupby
в оба столбца взять size
, отсортировать значения и выбрать значение с более высокой частотой:
(df.groupby(['category', 'value'])
.value.size()
.sort_values()
.groupby(level=0)
.tail(1))
category value
cat b z 1
cat a x 2
Name: value, dtype: int64