Я надеюсь, что кто-то с большим знанием, чем я, может дать некоторую мудрость, прежде чем я вытащу все свои волосы.
У меня есть датафрейм, который выглядит следующим образом
Date Unit Length AM/PM unit_new
5 Monday\r13 January 12345H\rEngineering - Unit 1: Engineering Principles\r23456H\rHealth and Social Care - Unit 2: Working in Health\rand Social Care 2h 00m\r1h 30m morning
6 Tuesday\r14 January 34567H\rBusiness/Enterprise and Entrepreneurship -\rUnit 3: Personal and Business Finance\r12345L\rApplied Human Biology - Unit 1: Principles of\rHuman Biology\r23456K\rConstruction and the Built Environment -\rUnit 1: Construction Principles 2h 00m\r1h 30m\r1h 30m morning
7 Wednesday\r15 January 34567H/1C\rApplied Science/Forensic and Criminal Investigation\r- Unit 1: Principles and Applications of Science I -\rChemistry\r12345H\rSport and Exercise Science - Unit 1: Sport and Exercise\rPhysiology 0h 40m\r1h 30m morning
Теперь проблема, которую я имейте это, что у столбца 'Единицы' есть многократное количество записей данных в каждой строке, но это не является последовательным в количестве записей в строке. Столбец length имеет ту же настройку, что и столбец Unit. Столбцы «Дата» и «AM / PM» имеют одну запись.
Это изображение лучше объясняет проблему. В строке 5 есть две записи, одна для Инжиниринга и одна для HS C, столбец длины следует примеру. «Дата» и «AM / PM» одинаковы для обеих записей. В строке 6 есть три записи, а в строке 7 - две.
Теперь я пытаюсь разбить каждую запись на отдельный ряд. Пытаясь сделать это, я попробовал несколько различных методов и не нашел много оснований.
Идея метода один Моей первой мыслью было попытаться добавить новые строки под соответствующими строка и извлекать данные из столбцов «Единица» и «Длина» при копировании данных из столбцов «Дата» и «AM / PM». Это оказалось уловкой, поскольку вставка в середину df более сложна.
Идея метода два Затем я решил добавить строки в конец df и отсортировать позже.
Итак, я написал функцию, которая подсчитывает количество записей в каждой строке и выводит в серию.
def code_count_func():
code_count = df.Unit.str.count('\d{5}\w').subtract(+1)
# drop na's to stop error
code_count.dropna(inplace = True)
# converting to int
code_count = code_count.iloc[0:].astype(int)
Приведенный ниже код - это то, что я пытаюсь разбить на список строк в новом столбце под названием «unit_new», но регулярное выражение не совсем захватывает согласно моему красочному изображению.
for index, row in code_count_func().iteritems():
df['unit_new'] = df.Unit.str.split('(\d{5}\w)')
Вторая проблема заключается в том, что я также не уверен, как найти sh программа. Я думал об использовании метода DataFrame.explode
, но я не уверен, как его использовать в столбцах «Единица» и «Длина», а просто скопировать из столбцов «Дата» и «AM / PM».
Может кто-то пожалуйста, дайте мне несколько советов о том, как использовать метод разнесения или аналогичный. Также, если кто-нибудь сможет помочь с моим регулярным выражением, пожалуйста.
Еще немного о вопросах регулярного выражения. Таким образом, единственное, что согласуется с шаблоном в столбце «Единица», это пять цифр ди git и одна буква, например, 12345 КБ, которые используются в начале каждой новой записи. Итак, глядя на строку 5, я хочу получить следующее: -
12345H \ rИнжиниринг - Блок 1: Принципы машиностроения \ r 23456H \ rЗдоровье и социальное обеспечение - Блок 2: Работа в сфере здравоохранения \ rand Social Care
Я пробовал несколько шаблонов, но не повезло.
Требуемый вывод