1
resposta

Como fazer um pd.cut com mesmo numero de bins e labels?

Tenho uma banco de dados de tons de 100 musicas, os tons seguem a notação padrão de classe de tom que varia de 0 a 11, quero usar o pd.cut para organizar de que um lado mostre a nota inves do numero e o outro lado a quantidade de vezes que ele aparece no banco, entao inves de so usar o pd.value_counts e eu poder ver de um lado a notação do tom e do outro lado a quantidade de vezes que apareceu quero usar o cut para trocar isso para o nome da nota e a quantidade de vezes que ela aparece (no caso vou querer em porcentagem).

Meu codigo esta assim:

classes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
labels = ['Do', 'Do♯ / Re♭', 'Re', 'Re♯ / Mi♭', 'Mi', 'Fa', 'Fa♯ / Sol♭', 'Sol', 'Sol♯ / La♭', 'La', 'La♯ / Si♭', 'Si']
frequencia = pd.value_counts(pd.cut(x = dados.key,
       bins = classes,
       labels = labels,
       include_lowest = True))
frequencia

Mas quando rodo o seguinte erro aparece:

ValueError: Bin labels must be one fewer than the number of bin edges

Aparentemente o numero de bins não pode ser igual o de labels...? Como corrijo isso para poder fazer a tabela?

1 resposta

Boas Tibério! Tudo bem, espero que sim!

O que ocorre é que: há uma relação um pouco diferente do número de bins com o número de labels.

Nos bins, deve ser indicado uma lista de limites para os valores. Sendo que a partir dessa lista, são criados intervalos: vou dar um exemplo:

Pensando em classificar uma porcentagem em pouco médio e muito, podemos fazer da seguinte forma:

labels = ['pouco', 'medio', 'muito' ]

Mas como criamos a lista de bins? Devemos atribuir sempre os limites dos que serão usados para definir esse intervalo. No meu caso, gostaria de que de 0% a 33% é considerado pouco, entre 33% e 66% é considerado médio e entre 66% é e 100% é condirado muito. Perceba que, mesmo usando 3 labels, eu precisei de 4 valores para estabelecer os limites:

bins = [0, 33, 66, 100]

Isso sempre vai ocorrer, pois temos que deixar explícitos os limites inferiores e superiores de cada classe, sendo que o número de bins (limites) é sempre maior em uma unidade que o número de labels ( n_bins = 1 + n_labels).

No seu caos, o número de bins (limites) é igual ao número de labels, logo ele consegue montar apenas 10 intervalos com os limites fornecidos, e não 11 como é o desejado.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!