Ответ Густаво верен, но имеет небольшую проблему (и по какой-то причине я не могу отредактировать его ответ).
label='TARGET_VAR'
g = df.groupby(label, group_keys=False)
balanced_df = pd.DataFrame(g.apply(lambda x:
x.sample(g.size().min()).
reset_index(drop=True)))
Здесь индекс будет сброшен для каждой группы, и итоговый кадр данных будет иметьповторяющиеся индексы строк.Если мы определим количество элементов в классе меньшинства как n
:
idx, data
0, ...
1, ...
., ...
., ...
., ...
n, ...
0, ...
1, ...
., ...
., ...
., ...
n, ...
Следующая настройка решит проблему
g = df.groupby(label, group_keys=False)
balanced_df = pd.DataFrame(g.apply(lambda x:
x.sample(g.size().min()))).reset_index(drop=True)
Если мы теперь определим общее количество элементовbalanced_df
как N=n*k
, где k
- количество разных классов.Индекс будет выглядеть так:
idx, data
0, ...
1, ...
., ...
., ...
., ...
N, ...