Очистка непоследовательных категорий данных в Python

#python #data-science #data-cleaning

#питон #наука о данных #очистка данных

Вопрос:

У меня есть фрейм данных в Python, в котором есть столбец для типов университетских степеней, где степени упоминаются очень непоследовательно. В общей сложности существует около 12 654 уникальных типов степеней, для классификации которых вручную потребуется очень много времени.

Например, степень бакалавра может быть указана как любой из приведенных ниже типов:

‘Sc.B’, ‘S.B.’, ‘Двойная степень’, ‘BEng.’, ‘Бакалавр права’, ‘B.sc «, «Бакалавр прикладных наук (B.A.Sc .)», «Бакалавр инженерных наук (BE)», «Бакалавр технических наук», «БакалаврИнженерия», «(B.S.)», «Степень бакалавра в области делового администрирования», «Лицензиатура», «Бакалавр наук», «B.Bus», «Бакалавр искусств — бакалавр», «Бакалавр наук в области делового администрирования», «Бакалавр наук», «Бакалавр (с отличием) ‘, ‘B.S.E.E.’, ‘B Eng’,’B.Comm.’, ‘BSM’, «Степень бакалавра естественных наук с отличием», «Бакалавр», «Бакалавр делового администрирования», «B.Acc», «Степень бакалавра искусств с отличием», ‘B.S.E.E’, ‘L.L.B.’, ‘Гуманитарные науки’, ‘Бакалавр’, ‘Степень бакалавра’

Степень магистра может быть любого из перечисленных ниже типов:

«Магистр наук», «Магистр наук», «Доктор медицинских наук», «Магистр наук», «Магистр наук», «Магистр английского языка», «Магистр наук», «Магистр наук», «PGDM», «Образование для руководителей», «Выпускной», «LL.M ‘, ‘MPH’, ‘CA’, ‘Diplom’, ‘Executive Program’, ‘SM’, ‘L.L.M’, ‘Стипендия’, ‘Магистр наук’, ‘Магистр права’, ‘Магистр наук (M.S.)’, ‘Магистр наук(MS) ‘, ‘Степень магистра’, ‘MsC’, ‘CFA’, ‘Диплом выпускника’, ‘M. Sc.’, ‘MTech’, ‘Магистр искусств (M.A.)’, ‘CPA’, ‘Магистр делового администрирования — MBA’, ‘M.Ed’, ‘M.E.’, ‘Специализация’, ‘Магистр менеджмента’, ‘AMP’, ‘Дипломированный бухгалтер’, ‘Ординатура’, ‘MED’, ‘MM’, ‘Магистры искусств’, ‘MASc’, ‘PGDBM’, ‘MPS’, ‘Международный MBA’,»(MBA)», «M.Arch», «MIS», «MHA», «Степень магистра искусств», «MSci», «PG», «M.Tech.», «Магистр наук — MS», «магистр», «M.Phil.», «Степень магистра ‘

и так далее со средней школой, младшим специалистом и доктором философии.

Я хотел бы найти короткий путь, чтобы классифицировать большинство из них на уровень средней школы, младшего специалиста, бакалавра, магистра или доктора философии / доктора наук.

У кого-нибудь есть какие-нибудь предложения?

В некоторых статьях в Интернете предлагается использовать такие инструменты, как Fuzzywuzzy. Я никогда не пользовался этим и не уверен, что это действительно поможет мне здесь.

Я действительно новичок в Python / Datascience и не совсем уверен, как это сделать, поэтому, пожалуйста, объясните как можно более четко.

Спасибо вам и с нетерпением ждем решения 🙂

Комментарии:

1. Есть ли ваши данные в списке python? Или вы используете пакет типа numpy или pandas? Если это просто список, то для начала нужно пройтись по списку с помощью блока if / elif, like if 'bachelor' in degree_name: do_something() elif 'master' in degree_name: do_something_else() и так далее, а затем посмотреть, что осталось, и написать еще несколько elif s для ваших крайних случаев.

2. @aidanS набор данных — это, по сути, столбец из фрейма данных. Не могли бы вы подробнее объяснить, что вы подразумеваете под циклическими функциями if и elif?

Ответ №1:

следуя моему комментарию к вашему вопросу:

этот первый блок дает мне фрейм данных, похожий на то, как, по моему мнению, выглядит ваш:

 import pandas as pd
import numpy as np

your_list = np.array(['Sc.B','S.B.','Dual Degree','BEng. 2master','M.Phil.','Masters degree'])
names = np.array([f"person_{ii}" for ii in range(len(your_list))])

df = pd.DataFrame({"names": names, "degree_title": your_list})
print(df)
 

Теперь мы можем выполнить for цикл над данными degree_title с нашим первым предположением о том, как
могут выглядеть классы degree_title.

 new_classifications = [] # Make an empty list so we can keep track of what we classify the new degree as.

for degree in df["degree_title"]:
    if "bachelor" in degree.lower(): # lower() as we don't care if it's "Bachelor" or "bachelor"
        new_classifications.append("bachelor") # Anything here is good enough to be called "bachelor"
    elif "master" in degree.lower():
        new_classifications.append("master")
    elif "doctorate" in degree.lower():
        new_classification.append("phd")
    else:
        new_classifications.append("unclassified")
        print(f"no classification found for {degree}")
 

Это говорит нам о том, что нам не хватает множества результатов, таких как B.Sc , чтобы мы могли добавить проверки для тех, кто участвует в нашей второй попытке — обратите внимание на дополнения к строкам «бакалавр» и «магистр».

Обратите внимание, что есть строка, которая получает «крайние случаи» — из названия я никак не могу догадаться, что «Специализация» была квалификацией уровня магистра, поэтому мы должны сделать это «вручную».

 new_classifications = [] 

for degree in df["degree_title"]:
    if "bachelor" in degree.lower() or degree.lower().startswith("b") or "b." in degree.lower():
        new_classifications.append("bachelor")
    elif "B" in degree and degree.isupper(): # Also require the whole title to be uppercase 
        new_classifications.append("bachelor")
    elif "master" in degree.lower() or degree.lower().startswith("m") or "m." in degree.lower():
        new_classifications.append("master")
    elif "M" in degree and degree.isupper():
        new_classifications.append("master")
    elif "doctorate" in degree.lower():
        new_classification.append("phd")
    elif degree in ["Diplom", "Fellowship", "CPA", "Specialisation", "Graduate Diploma"]:
        new_classifications.append("some_classification_that_you_write_for_these_edge_cases")
    else:
        new_classifications.append("unclassified")
        print(f"no classification found for {degree}")
 

Когда мы будем довольны, мы можем добавить красиво классифицированные степени в dataframe

 df["new_classification"] = new_classifications
print(df)
 

Это очень «грубый» способ решения этой проблемы, но, учитывая, что многие названия степеней будут следовать аналогичной схеме, это довольно простой способ начать работу и удалить большую часть работы, оставив гораздо меньше для классификации вручную.

Комментарии:

1. Я очень сомневаюсь, что это правильный путь! Если мы перечисляем все возможности и проверяем взад и вперед, чего не хватает, то почему бы просто не заменить и их. Это как бы теряет смысл кода. Пожалуйста, уточните, если я что-то упускаю

2. Верно — три отдельных блока должны были быть моими «итерациями» над проблемой — улучшая каждый по мере продвижения, а не все три блока, включенные в фактический код. Я включил их, чтобы показать свой мыслительный процесс. Однако, если вы считаете, что мой ответ бесполезен, я могу его удалить.

3. Вместо удаления было бы лучше, если бы вы добавили к нему больше контекста, например, почему он полезен в этом сценарии и почему его следует выбрать.

4. Спасибо за ваши комментарии — я новичок в ответе на StackOverflow, поэтому приятно получать отзывы.

5. Спасибо за ваш вклад. Я займусь этим вопросом и соответствующим образом прослежу за ним. Похоже, что нет простого способа очистить такие данные.