Python - Pandas, reamostrar o conjunto de dados para ter classes balanceadas

Com o seguinte quadro de dados, com apenas 2 etiquetas possíveis:

   name  f1  f2  label
0     A   8   9      1
1     A   5   3      1
2     B   8   9      0
3     C   9   2      0
4     C   8   1      0
5     C   9   1      0
6     D   2   1      0
7     D   9   7      0
8     D   3   1      0
9     E   5   1      1
10    E   3   6      1
11    E   7   1      1

Eu escrevi um código para agrupar os dados pela coluna 'nome' e dinamizar o resultado em uma matriz numpy, de modo que cada linha é uma coleção de todas as amostras de um grupo específico, e os lables são outra matriz numpy:

Dados

[[8 9] [5 3] [0 0]] # A lable = 1
[[8 9] [0 0] [0 0]] # B lable = 0
[[9 2] [8 1] [9 1]] # C lable = 0
[[2 1] [9 7] [3 1]] # D lable = 0
[[5 1] [3 6] [7 1]] # E lable = 1

Lables:

[[1]
 [0]
 [0]
 [0]
 [1]]

Código

import pandas as pd
import numpy as np


def prepare_data(group_name):
    df = pd.read_csv("../data/tmp.csv")


    group_index = df.groupby(group_name).cumcount()
    data = (df.set_index([group_name, group_index])
            .unstack(fill_value=0).stack())



    target = np.array(data['label'].groupby(level=0).apply(lambda x: [x.values[0]]).tolist())
    data = data.loc[:, data.columns != 'label']
    data = np.array(data.groupby(level=0).apply(lambda x: x.values.tolist()).tolist())
    print(data)
    print(target)


prepare_data('name')

Gostaria de redefinir a amostra e excluir instâncias da classe com excesso de representaçã

i.e

[[8 9] [5 3] [0 0]] # A lable = 1
[[8 9] [0 0] [0 0]] # B lable = 0
[[9 2] [8 1] [9 1]] # C lable = 0
# group D was deleted randomly from the '0' labels 
[[5 1] [3 6] [7 1]] # E lable = 1

seria uma solução aceitável, pois a remoção de D (rotulado '0') resultará em um conjunto de dados balanceado de 2 * rótulo '1' e 2 * rótulo '0'

questionAnswers(2)

yourAnswerToTheQuestion