0
respostas

Métodos de não repetir alunos no mesmo curso?

Olá, percebi que no código utilizado pelo professor para atribuir a quantidade de cursos para cada aluno, alguns alunos estão matriculados em um mesmo curso, algo que não bate com a lógica do exercício que estamos fazendo.

Vi que algumas pessoas também perceberam isso e postaram aqui no fórum, de forma que foi sugerido a utilização da função drop_duplicates do pandas. Realmente o drop_duplicates pode solucionar esse problema de um aluno matriculado em um mesmo curso duas vezes, porém se eu aplico a função e removo essas informações, acaba que terei uma diferença de valor final entre o número total de matrículas por aluno (somando a quantidade de matriculas por cada aluno) e o número de matrículas do meu DataFrame final (Aquele em que removi os resultados duplicados, através do drop_duplicates). Então, buscando resolver esse problema logo na atribuição dos cursos, de forma que ambos os valores finais se igualassem, tentei modificar o código utilizado pelo professor:

for index, row in nomes.iterrows():
    id = row.id_aluno
    matriculas = row.matriculas
    for i in range(matriculas):
        mat = [id, np.random.choice(cursos.index, p = prob)]
        todas_matriculas.append(mat)
matriculas = pd.DataFrame(todas_matriculas, columns = ['id_aluno', 'id_curso'])
matriculas

Para esse aqui:

for index, row in nomes.iterrows():
    id = row.id_aluno
    matriculas = row.matriculas
    for i in range(matriculas):
        mat = [id, np.random.choice(cursos.index, p = prob)]
        if mat not in todas_matriculas:
            todas_matriculas.append(mat)
        else:
            i = i - 1
matriculas = pd.DataFrame(todas_matriculas, columns = ['id_aluno', 'id_curso'])
matriculas

Minha ideia era criar uma condição para verificar se o mesmo aluno ainda não havia sido matriculado no curso e, caso a resposta fosse negativa, eu não adicionaria ele na lista final que seriam os dados do meu dataframe. Porém percebi que esse código apresentado não funcionava, pois o 'i' não era subtraído na contagem do range(), gerando o mesmo 'problema' de se utilizar o drop_duplicates (não teríamos alunos/curso duplicados, porém teríamos uma diferença entre valores de matrículas).

Posteriormente consegui resolver o problema a partir deste código:

for index, row in nomes.iterrows():
    i = 0
    id = row.id_aluno
    matriculas = row.matriculas
    while i < matriculas:
        mat = [id, np.random.choice(cursos.index, p = prob)]
        if mat not in todas_matriculas:
            todas_matriculas.append(mat)
        else:
            i = i-1
        i = i + 1

Apesar de funcionar a lógica e ter todos os valores iguais, sem repetição de alunos e matrículas, achei a codificação dele meio feia, ou deselegante. Gostaria de saber se é possível eu ter esse mesmo resultado através da minha primeira alteração de código, onde tive o problema da subtração do 'i' não afetar a contagem no range(). Tem algum modo que posso ter esse efeito? Ou, então, tem alguma outra sugestão de código mais bonito e elegante, parecido com o desenvolvido inicialmente pelo professor?

Perdão pela loooonga dúvida!