Python pandas объединение строк, добавление строк, разных для каждого столбца - PullRequest
1 голос
/ 20 января 2020

Я надеюсь, что кто-то с большим знанием, чем я, может дать некоторую мудрость, прежде чем я вытащу все свои волосы.

У меня есть датафрейм, который выглядит следующим образом

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 - две.

dataframe

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

Идея метода один Моей первой мыслью было попытаться добавить новые строки под соответствующими строка и извлекать данные из столбцов «Единица» и «Длина» при копировании данных из столбцов «Дата» и «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

Я пробовал несколько шаблонов, но не повезло.

Требуемый вывод

output

1 Ответ

0 голосов
/ 20 января 2020

Это могло бы работать и могло бы быть лучше с более усовершенствованным регулярным выражением. Мои столбцы могут быть отключены от процесса копирования / вставки, но логика c должна быть правильной

Получить единицы

df['Unit'] = df['Unit'].str.split('(.+?(?=\d{5}))')

Получить длины

lengths = df['AM/PM'].str.split(r'\\r').explode()

Разбейте единицы, удалите пустые записи из регулярного выражения и объедините длины обратно в фрейм данных

df = pd.concat([df.explode('Unit').query("Unit != ''"), lengths], axis=1)

            Date           ...                                               Unit   AM/PM
5     Monday\r13  January  ...  12345H\rEngineering - Unit 1: Engineering Prin...  2h 00m
5     Monday\r13  January  ...  23456H\rHealth and Social Care - Unit 2: Worki...  1h 30m
6    Tuesday\r14  January  ...  34567H\rBusiness/Enterprise and Entrepreneursh...  2h 00m
6    Tuesday\r14  January  ...  12345L\rApplied Human Biology - Unit 1: Princi...  1h 30m
6    Tuesday\r14  January  ...  23456K\rConstruction and the Built Environment...  1h 30m
7  Wednesday\r15  January  ...  34567H/1C\rApplied Science/Forensic and Crimin...  0h 40m
7  Wednesday\r15  January  ...  12345H\rSport and Exercise Science - Unit 1: S...  1h 30m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...