Как добавить новый столбец в фрейм данных из вывода re.search? - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь извлечь числа из столбца в кадре данных, используя функцию re.search для поиска числовых символов, а затем преобразовать из "14 mins 16 secs" в 856 (секунды). и я хочу, чтобы вывод re.search был сохранен в новом столбце.

Это подмножество текущего фрейма данных. Столбец, который я хочу изменить, называется 'Time taken':

Data Frame

Я пытаюсь с re.search, и в настоящее время он выводит преобразованные минуты в секундах, но я не могу сохранить выходные данные в новом столбце ...

MS_REGEX = re.compile('^(\d+)\smins\s(\d+)\ssecs$')
M_REGEX = re.compile('^(\d+)\smins$')
MSEC_REGEX = re.compile('^(\d+)\smins\s(\d+)\ssec$')

def total_seconds(time_col):
        found = MS_REGEX.search(time_col)
        if found:
            return 60 * int(found.group(1)) + int(found.group(2))

        found = M_REGEX.search(time_col)
        if found:
            return 60 * int(found.group(1))


        found = MSEC_REGEX.search(time_col)
        if found:
            return 60 * int(found.group(1)) + int(found.group(2))


for elements in df['Time taken']:
     print(total_seconds(elements))

Мой вывод показывает new_column как значения NaN ...

Output

Я хочу что-то вроде этого: Desired Output

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Один из возможных вариантов - извлечь последовательности цифр в временный фрейм данных:

tm = df['Time taken'].str.extract('(?P<mins>\d+)\D+(?P<secs>\d+)?')\
    .fillna(0).astype('int')

Обратите внимание, что имена столбцов взяты из имен групп захвата.

Fillna требуется для изменения значений NaN пропущенных секунд на нули. И, наконец, astype необходим для переопределения типа по умолчанию object (извлеченные последовательности являются строками).

Затем вы можете установить столбец time с помощью числовой формулы:

df['time'] = tm.mins * 60 + tm.secs

И, наконец, вы должны удалить временный DataFrame, используя del tm.

Преимущество моего решения в том, что столбец Time taken не изменяется.

0 голосов
/ 13 января 2019

В Pandas уже есть встроенный метод для анализа ряда строк в серии объектов timedelta, pandas.to_timedelta.

Однако, чтобы это работало, сначала нужно немного изменить строки, чтобы сработал автоматический анализатор. "mins" необходимо заменить на "min" и "secs" и "sec" на "s":

import pandas as pd

df = pd.DataFrame({"Time taken": ["14 mins 16 secs", "17 mins 54 secs", "18 mins", "18 mins 1 sec"]})
df["Time taken"] = df["Time taken"].str.replace("mins", "min").str.replace("secs|sec", "s")
df["time"] = pd.to_timedelta(df["Time taken"]).dt.total_seconds()
df
#     Time taken    time
# 0  14 min 16 s   856.0
# 1  17 min 54 s  1074.0
# 2       18 min  1080.0
# 3   18 min 1 s  1081.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...