Сортировка частотного распределения строки с использованием rank (Python)

#python #pandas #sorting

#python #pandas #сортировка

Вопрос:

Я должен отсортировать частотное распределение строковой переменной (education), используя заранее определенные ранги, и код, который я сделал, приведен ниже. Тем не менее, он по-прежнему сортируется по алфавиту (пожалуйста, найдите прикрепленное изображение), я не знаю, что пошло не так.

 education_rank = {' Bachelors':12, ' HS-grad':8, ' 11th':6, ' Masters':14, ' 9th':5, ' Some-college':11, ' Assoc-acdm':10, ' Assoc-voc':9, ' 7th-8th':4, ' Doctorate':15, ' Prof-school':13, ' 5th-6th':3, ' 10th':16, ' 1st-4th':2, ' Preschool':1, ' 12th':7}

fd_education = pd.value_counts(adult_data.education)
print(fd_education)
    
fd_education = fd_education.sort_index(level='education_rank')
print(fd_education)
 

введите описание изображения здесь

Ответ №1:

Попробуйте этот метод —

  1. Сортировка в education_rank виде ряда для получения значений индекса
  2. Используйте значения индекса для извлечения строк из value_counts ряда
  3. Dropna если есть
 #Your predefined rankings
education_rank = {'Bachelors':12, 'HS-grad':8, '11th':6, 'Masters':14, '12th':77}

#Your frequency output from value_counts()
fd_education = pd.Series({'Bachelors':500, 'HS-grad':809, '11th':23, 'Masters':65})

fd_education[pd.Series(education_rank).sort_values().index].dropna()
 
 11th          23
HS-grad      809
Bachelors    500
Masters       65
dtype: int64
 

Объяснение —

Проблема в том, что вы передаете словарь на уровень вместо имени индекса объекта series. Цель уровня — помочь в ситуациях с несколькими индексами. Это позволяет ему решать, по какому из индексов производить сортировку. Вы не можете указать последовательность в виде списка / dict для сортировки.

Если он не может найти указанное вами имя индекса, он просто прибегнет к сортировке по алфавиту. Проверьте этот пример —

 #Your predefined rankings
education_rank = {'Bachelors':12, 'HS-grad':8, '11th':6, 'Masters':14, '12th':77}

#Your frequency output from value_counts()
fd_education = pd.Series({'Bachelors':500, 'HS-grad':809, '11th':23, 'Masters':65})
    
fd_education = fd_education.sort_index(level='hello') #<---- 
print(fd_education)
 
 11th          23
Bachelors    500
HS-grad      809
Masters       65
dtype: int64
 

Пожалуйста, ознакомьтесь с документацией для получения более подробной информации.