如何从re.search输出中向数据框添加新列?

时间:2019-01-13 09:02:13

标签: python pandas dataframe

我正在尝试使用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 :(得分:2)

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

答案 1 :(得分:0)

一种可能的选择是提取个数字序列到 临时DataFrame:

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

请注意,列名取自捕获组名。

菲尔纳需要将丢失的秒数的NaN值更改为零。 最后,需要 astype 来覆盖 object 的默认类型 (提取的序列是字符串)。

然后,您可以使用数字公式设置time列:

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

最后,您应该使用del tm删除临时DataFrame。

我的解决方案的优点是Time taken列未更改。